Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 列表从数据库中膨胀,每个用户需要有一个条目,它有多个条目_Android_Arrays_List_Sorting_Collections - Fatal编程技术网

Android 列表从数据库中膨胀,每个用户需要有一个条目,它有多个条目

Android 列表从数据库中膨胀,每个用户需要有一个条目,它有多个条目,android,arrays,list,sorting,collections,Android,Arrays,List,Sorting,Collections,我有一个从数据库加载的列表。此列表包含与您联系的所有用户以及他们发送给您的所有消息。现在我需要获取该列表,并且只显示每个用户一次,以及从该用户收到的最后一条消息的时间。列表是一个对象列表,其中包含消息、用户id、用户名和消息日期 这就是我为每个用户获取最后日期所做的逻辑。然后使用集合按日期对它们进行排序: ArrayList<NTFMessage> list = new ArrayList<NTFMessage>(); if (ntfmsg

我有一个从数据库加载的列表。此列表包含与您联系的所有用户以及他们发送给您的所有消息。现在我需要获取该列表,并且只显示每个用户一次,以及从该用户收到的最后一条消息的时间。列表是一个对象列表,其中包含消息、用户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()));
                    }
                });
ArrayList list=new ArrayList();
如果(ntfmsgsList.size()>0){
添加(ntfmsgsList.get(0));
对于(inti=1;iLong.valueOf(ntfmsglist.get(i.getDate())){
LogService.log(标记“------------内容集最后日期”);
ntfMessage.setDate(ntfmsgsList.get(i).getDate());
}
打破
}如果(!ntfMessage.getUser_from().contentEquals(ntfmsgsList.get(i).getUser_from()),则为else{
LogService.log(标记,“-----------content不等于doesadd”);
加法=真;
打破
}
}
如果(添加){
LogService.log(标记“------------添加”);
添加(ntfmsgsList.get(i));
add=false;
}
}
}
LogService.log(标记“-----------List size:+List.size());
Collections.sort(list,newcomparator(){
@凌驾
公共整数比较(NTFMessage mess1、NTFMessage mess2){
返回Long.valueOf(mess2.getDate()).compareTo(Long.valueOf(mess1.getDate());
}
});
我的逻辑是:我创建了一个新的列表,caled list。我在其中添加第一个名字,然后遍历ntfmsgslist并添加列表中没有的名字。如果我选中的名字已经在列表中,那么我只会更改更大的日期。你知道我怎么能这样工作吗?
因为现在它几乎显示了所有的副本,只有一个名称显示一次而不是三次。

我认为您的代码太复杂了。您可以简单地执行以下操作:

  • 使用
    HashMap
    ,其中键是用户名,值是实际的
    NTFMessage
    (?)
  • 迭代整个ntfmsgsList列表
  • 对于列表中的每个元素,获取
    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);             
         }           
     } 
}
HashMap result=newhashmap();
对于(inti=0;i0){
//如果状态大于0,则表示当前项
//有一个更新的日期或任何你有逻辑
结果.输入(用户名,当前);
}           
} 
}

一个简单的问题,在完成此操作后,如何将结果hashmap转换回arraylist?我尝试对hashmap的大小进行for迭代并添加值,但后来我发现对于“Get”,我需要的是值,而不是值index@rosualin如果我没有弄错的话,映射有一个
values()
方法,该方法返回一个
集合
,您可以将其添加到一个空的
数组列表
。谢谢,但我已经想出来了,做了,但我吃完午饭忘了在这里发帖。很多时候,我从未使用过hashmaps,现在我知道它们在某些情况下是多么有用