我有一个从数据库加载的列表。此列表包含与您联系的所有用户以及他们向您发送的所有邮件。现在我需要获取该列表,并且只显示每个用户一次,并显示从该用户收到的最后一条消息的时间。该列表是一个对象列表,其中包含消息,用户ID,用户名和消息日期。
现在这是我为每个用户获取最后日期所做的逻辑。然后使用集合按日期对它们进行排序:
ArrayList<NTFMessage> list = new ArrayList<NTFMessage>();
if (ntfmsgsList.size() > 0) {
list.add(ntfmsgsList.get(0));
for (int i = 1; i < ntfmsgsList.size(); i++) {
for (NTFMessage ntfMessage : list) {
if (ntfMessage.getUser_from().contentEquals(ntfmsgsList.get(i).getUser_from())) {
LogService.log(TAG, "---------content equals doesnt add");
if (Long.valueOf(ntfMessage.getDate()) > Long.valueOf(ntfmsgsList.get(i).getDate())) {
LogService.log(TAG, "---------content sets last date");
ntfMessage.setDate(ntfmsgsList.get(i).getDate());
}
break;
} else if (!ntfMessage.getUser_from().contentEquals(ntfmsgsList.get(i).getUser_from())) {
LogService.log(TAG, "---------content doesnt equals does add");
add = true;
break;
}
}
if (add) {
LogService.log(TAG, "---------adds");
list.add(ntfmsgsList.get(i));
add = false;
}
}
}
LogService.log(TAG, "---------List size: " + list.size());
Collections.sort(list, new Comparator<NTFMessage>() {
@Override
public int compare(NTFMessage mess1, NTFMessage mess2) {
return Long.valueOf(mess2.getDate()).compareTo(Long.valueOf(mess1.getDate()));
}
});
我的逻辑是:我创建了一个新的列表,caled list。我在其中添加了第一个名称,然后我浏览了ntfmsgslist并添加了列表中没有的名称。如果我检查的名称已经在列表中,那么我只会更改日期,如果它更大。有什么想法,我怎么能这样做? 因为现在它几乎显示了所有重复项,所以只显示一个名称而不是3次。
答案 0 :(得分:1)
我认为你的代码很复杂。你可以简单地做这样的事情:
HashMap
,其中密钥为用户名,值为实际NTFMessage
(?)NTFMessage
并提取用户名HashMap
进行测试,看看您是否已经拥有此名称的密钥。如果您还没有具有此名称的密钥,请将其与NTFMessage
一起添加到上一个Hashmap。如果您确实有此名称的密钥,请使用NTFMessage
并查看其日期的位置(并根据该日期替换初始NTFMessage
地图对象或更新其日期字段)。代码示例:
HashMap<String, NTFMessage> result = new HashMap<String, NTFMessage>();
for (int i = 0; i < ntfmsgsList.size(); i++) {
final NTFMessage current = ntfmsgsList.get(i);
final String userName = current.getUser_from();
final NTFMessage stored = result.get(userName);
if (stored == null) {
// we don't have this username in the map so add it
result.put(userName, current);
} else {
// there's already a message for this username so see what's up with that
int status = Long.valueOf(current.getDate()).compareTo(Long.valueOf(stored.getDate()));
if (status > 0) {
// if status is greater than 0 that means the current item
// has a more current date or whatever logic you have
result.put(userName, current);
}
}
}