-1

我有一个从数据库加载的列表。此列表包含与您联系的所有用户以及他们发送给您的所有消息。现在我需要获取该列表,并且只显示每个用户一次,以及从该用户收到的最后一条消息的时间。该列表是一个对象列表,其中包含消息、用户 ID、用户名和消息日期。

现在这是我为每个用户获取最后日期所做的逻辑。然后使用 Collections 按日期对它们进行排序:

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()));
                    }
                });

我的逻辑是:我创建一个新列表,称为列表。我在其中添加第一个名字,然后通过 ntfmsgslist 并添加不在列表中的名字。如果我检查的名称已经在列表中,那么我只会更改更大的日期。任何想法我怎么能做到这一点?因为现在它显示了几乎所有重复项,所以只显示了一个名称而不是 3 次。

4

1 回答 1

1

我认为你的代码很复杂。你可以简单地做这样的事情:

  • 使用 a HashMap,其中键是用户名,值是实际NTFMessage(?)
  • 遍历整个 ntfmsgsList 列表
  • 对于列表中的每个元素,获取NTFMessage并提取用户名
  • 对照前一个测试它HashMap,看看您是否已经有一个具有此名称的密钥。如果您还没有具有此名称的键,请将其与NTFMessage. 如果您确实有此名称的键,则使用该键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);             
         }           
     } 
}
于 2013-09-30T08:03:37.127 回答