【问题标题】:What is the best way to search elements in a list with nested elements?在具有嵌套元素的列表中搜索元素的最佳方法是什么?
【发布时间】:2017-05-26 04:23:37
【问题描述】:

我有 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(按用户名搜索)。

我正在做的一种方法是做一个辅助列表,搜索每个组,并在“内部”寻找永远的 chatContact,如果存在,我将组与联系人一起添加:

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

所有这些都很完美。但是目前,这个列表中的组很少,每个组的联系人也很少,但将来会有很多元素,这可能是一个“慢”的解决方案。

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

【问题讨论】:

  • 您会一直按name 搜索,还是也想按其他属性搜索?
  • 总是按名字命名,因为我所拥有的是一个视图,带有一个可扩展的列表,它以父母、每个组和孩子的身份显示每个组下面的联系人。并且用户必须能够在此列表中搜索。
  • 为什么要使用名称进行包含搜索?您是否真的要搜索“a”之类的东西,并希望每个名字中都有字母 A 的人?这种类型的搜索没有很好的索引。
  • 是的。我知道这不是一个好的搜索方式。最好在名字的开头搜索,但是,老板想要那样,所以......:/我会试图说服他,但他的思想很封闭。

标签: java search


【解决方案1】:

不幸的是,如果您要认真搜索“a”之类的内容,并希望所有姓名中的任何位置都包含字母 A 的人,那么这种类型的搜索不会很好地索引。

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

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

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

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

  4. 根据您的用例,可能会返回过滤后的“视图”而不是快照。然而,这可能会增加一些复杂性和可能的​​问题。

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 2015-06-04
    • 2013-11-19
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多