Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Java 在包含嵌套元素的列表中搜索元素的最佳方法是什么?_Java_Search - Fatal编程技术网

Java 在包含嵌套元素的列表中搜索元素的最佳方法是什么?

Java 在包含嵌套元素的列表中搜索元素的最佳方法是什么?,java,search,Java,Search,我有两门课: public class ChatGroup{ final public String name; private List<ChatContact> contacts; /* ---getters/setters/constructors-- */ } public class ChatContact implements Parcelable, Comparable { final public String name; f

我有两门课:

public class ChatGroup{
    final public String name;
    private List<ChatContact> contacts;
    /* ---getters/setters/constructors-- */
}

public class ChatContact implements Parcelable, Comparable {
    final public String name;
    final public String jid;
    public Status status;
    /* ---getters/setters/constructors-- */
}
公共类聊天组{
最终公共字符串名称;
私人名单联系人;
/*---获取者/设置者/构造函数--*/
}
公共类ChatContact实现可包裹、可比较{
最终公共字符串名称;
最终公共字符串jid;
公众地位;
/*---获取者/设置者/构造函数--*/
}
然后我有一个聊天组项目列表:

List<ChatGroup> chatGroupList = .....;
List chatGroupList=。。。。。;
正如您所看到的,每个聊天组都有一个聊天联系人列表,我需要的是在聊天组列表中搜索与查询匹配的聊天联系人(按用户名搜索)

我正在做的一个方法是,做一个辅助列表,搜索每个组,并查看“内部”是否存在聊天联系人,如果存在,我添加带有联系人的组:

private List<ChatGroup> searchContacts(String query) {
    List<ChatGroup> filteredContacts = new ArrayList<>();

    for (ChatGroup chatGroup : chatGroupList) {
        ChatGroup auxChatGroup = new ChatGroup(chatGroup.name);
        for (ChatContact chatContact : chatGroup.getContacts()) {
            if (chatContact.name.toLowerCase().contains(query)) {
                auxChatGroup.addContact(chatContact);
            }
        }
        if (auxChatGroup.getContacts().size() > 0)
            filteredContacts.add(auxChatGroup);
    }
    for (ChatGroup chatGroup : filteredContacts) {
        Collections.sort(chatGroup.getContacts());
    }
    return filteredContacts;
}
私人列表搜索联系人(字符串查询){
List filteredContacts=new ArrayList();
用于(聊天组聊天组:聊天组列表){
ChatGroup auxChatGroup=新的聊天组(ChatGroup.name);
对于(ChatContact ChatContact:chatGroup.getContacts()){
if(chatContact.name.toLowerCase().contains(查询)){
auxChatGroup.addContact(chatContact);
}
}
如果(auxChatGroup.getContacts().size()>0)
filteredContacts.add(auxChatGroup);
}
用于(聊天组聊天组:filteredContacts){
Collections.sort(chatGroup.getContacts());
}
返回过滤器安装的触点;
}
所有这些都很完美。但是现在,这个列表中只有很少的组,每个组都有很少的联系人,但是在将来,元素的数量会很大,这可能是一个“缓慢”的解决方案


所以我的问题是,有另一种更快的方法来进行这种类型的搜索吗?

不幸的是,如果你真的要搜索像“a”这样的东西,并且想要每个名字中任何一点都有字母a的人,那么这种类型的搜索并不能很好地索引

但是看看你的算法,我看到了一些可能的改进

  • 初始化
    ChatGroup auxChatGroup=null
    并仅在找到与筛选器匹配的结果时创建对象。如果有很多房间,这将避免创建一些不必要的对象

  • 每次搜索时对联系人列表进行排序似乎是浪费了很多精力。使用像TreeSet这样的分类集合可以为每次搜索节省大量时间

  • >P>如果群的数量变大,如以百万计,则考虑使用多线程搜索。

  • 根据您的用例,可能会返回一个过滤的“视图”而不是快照。然而,这可能会增加一些复杂性和可能的陷阱


  • 您总是按
    名称搜索吗
    还是也要按其他属性搜索?总是按名称搜索,因为我有一个视图,带有一个可扩展的列表,它以家长、每个组和孩子的身份显示每个组下面的联系人。并且用户必须能够在该列表中搜索。为什么要使用该名称进行包含搜索?你真的要去搜索像“a”这样的东西,并且想要每个名字中有字母a的人吗?这种类型的搜索没有很好的索引。是的。。我知道这不是一个好的搜索方式。最好在名字的开头搜索,但是,老板希望这样,所以…:/我会尽力说服他,但他太心胸狭窄了。