Я могу прочитать файл JSON, содержащий список сообщений и их соответствующих авторов. Структура одного сообщения следующая:
JSON
{
"created_at": "Thu Apr 30 10:47:49 +0000 2015",
"id": 593728455901990900,
"user": {
"id": 12,
"name": "GiGi",
"user_date": "Thu May 17 10:47:49 +0000 2010"
}
}
Классы Author и Message (POJO) содержат поля, которые мы хотим проанализировать, и функцию toString(), которая отображает поля в виде строки.
Автор
public class Author {
@SerializedName("id")
private static long id;
@SerializedName("created_at")
private static String user_date;
private static String name;
public String toString() {
return name + "\n" + id + "\n" + user_date;
}
....Getters & Setters....
}
Сообщение
public class Message {
@SerializedName("user")
Author author;
@SerializedName("created_at")
String date;
long id;
public String toString() {
return id + "\n" + date;
}
}
Author является классом-членом класса Message, и мне нужно отображать сообщения, сгруппированные по пользователю, но, похоже, я не нашел элегантного способа сделать это.
ОБНОВЛЕНИЕ
Решением было бы создать Карту, которая имеет одно из свойств автора как KEY (в этом образце кода это идентификатор автора) и соответствующий список сообщений как VALUE.
Map<Long, List<Message>> map = new HashMap<Long, List<Message>>();
for (Message msg : listOfMessages) {
long key = msg.getAuthor().getId();
if (map.get(key) == null) {
map.put(key, new ArrayList<Message>());
}
map.get(key).add(msg);
}
ВОПРОСЫ, которые могут возникнуть из этого решения:
- Как можно отобразить id И имя автора и соответствующий им список сообщений?
- Я не совсем уверен в элегантности этого решения, так как класс Message содержит класс Author и много ненужной информации «переносится» внутри значений MAP.
РЕШЕНИЕ
После добавления методов equals и hashCode в класс Author мы можем отображать экземпляры Author как ключи.
@Override
public int hashCode() {
int hash = 7;
hash = 23 * hash + (int) (this.id ^ (this.id >>> 32));
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Author author = (Author) obj;
if (this.id != author.id) {
return false;
}
return true;
}
А в основном классе мы можем пройтись по списку сообщений и правильно заполнить карту:
Map<Author, List<Message>> map = new HashMap<Author, List<Message>>();
for (Message message : listOfMessages) {
List<Message> userMessages = map.get(message.getAuthor());
if (userMessages == null) {
userMessages = new ArrayList<Message>();
map.put(message.getAuthor(), userMessages);
}
userMessages.add(message);
}
for (Entry<Author, List<Message>> entry : map.entrySet()) {
System.out.println(entry.getKey().getId());
for (Message message : entry.getValue()) {
System.out.println("\t" + message.getDate());
}
}
ВЫВОД
3037057186
Thu Apr 30 10:47:52 +0000 2015
1598532858
Thu Apr 30 10:47:51 +0000 2015
67267979
Thu Apr 30 11:47:49 +0000 2015
Thu Apr 30 10:47:49 +0000 2015
Thu Apr 30 10:47:49 +0000 2015
Thu Apr 30 10:47:49 +0000 2015