使用嵌套元素搜索列表中元素的最佳方法是什么?

时间:2017-01-11 11:34:55

标签: java search

我有2个班级:

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-- */
}

然后我有一个ChatGroup项目列表:

List<ChatGroup> chatGroupList = .....;

正如您所看到的,每个ChatGroup都有一个ChatContact列表,我需要的是在chatGroupsList中搜索匹配查询的ChatContacts(按用户名搜索)。

我正在做的一种方法是做一个辅助列表,搜索每个组,并查看&#34;内部&#34;对于everContact,如果存在,我将该组添加到联系人:

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

所有这一切都很完美。但是现在,这个列表中几乎没有几个联系人,每个联系人都很少,但是将来会有很多元素,这可能是一个慢的&#34;溶液

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

1 个答案:

答案 0 :(得分:1)

不幸的是,如果你真的想要搜索像&#34; a&#34;并希望每个人在姓名的任何一点都有字母A,这种搜索类型的索引不能很好。

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

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

  2. 每次进行搜索时对联系人列表进行排序似乎都会浪费很多精力。使用诸如TreeSet之类的已排序集合可以为每次搜索节省大量时间。

  3. 如果群组数量变得庞大,如同数百万,则考虑使用多线程搜索。

  4. 根据您的使用情况,可能会返回已过滤的&#34;视图&#34;而不是快照。然而,这可能会增加一些复杂性和可能的​​陷阱。