【发布时间】: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 的人?这种类型的搜索没有很好的索引。
-
是的。我知道这不是一个好的搜索方式。最好在名字的开头搜索,但是,老板想要那样,所以......:/我会试图说服他,但他的思想很封闭。