我有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;溶液
所以我的问题是,还有另一种更快的方式来进行这种搜索吗?
答案 0 :(得分:1)
不幸的是,如果你真的想要搜索像&#34; a&#34;并希望每个人在姓名的任何一点都有字母A,这种搜索类型的索引不能很好。
但是看看你的算法,我看到了一些可能的改进。
初始化ChatGroup auxChatGroup = null
并仅在找到与过滤器匹配的结果时创建对象。如果你有很多房间,这将避免创建一些不必要的对象。
每次进行搜索时对联系人列表进行排序似乎都会浪费很多精力。使用诸如TreeSet之类的已排序集合可以为每次搜索节省大量时间。
如果群组数量变得庞大,如同数百万,则考虑使用多线程搜索。
根据您的使用情况,可能会返回已过滤的&#34;视图&#34;而不是快照。然而,这可能会增加一些复杂性和可能的陷阱。