我想创建一个大型(~300,000个条目)类Drug
的自定义对象列表。
每种药物都有一个ID,我希望能够通过该ID在对数时间内搜索药物。
我必须使用什么样的清单?
我如何声明它可以通过ID搜索?
答案 0 :(得分:4)
Map接口的各种实现应该做你想要的。
如果您打算使用HashMap,请记住覆盖Drug类的hashCode()方法。
答案 1 :(得分:3)
public class Drug implements Comparable<Drug> {
public int compareTo(Drug o) {
return this.id.compareTo(o.getId());
}
}
然后在你的List中你可以使用binarySearch
List<Drug> drugList; <--- List of all drugs
Drug drugToSearchFor; <---- The drug that you want to search for, containing the id
// Sort before search
Collections.sort(drugList);
int index = Collections.binarySearch(drugList, drugToSearchFor);
if (index >= 0) {
return true;
} else {
return false;
}
答案 2 :(得分:2)
使用ID作为密钥,您不会使用TreeMap而不是List吗?
答案 3 :(得分:2)
如果按键搜索对您很重要,那么您可能需要使用Map而不是List。来自Java Collections Trail:
三个通用地图 实现是HashMap,TreeMap 和LinkedHashMap。如果你需要 SortedMap操作或按键排序 集合视图迭代,使用 TreeMap的;如果你想要最大的速度和 不关心迭代顺序,使用 HashMap的;如果你想要近HashMap 性能和插入顺序 迭代,使用LinkedHashMap。
答案 4 :(得分:2)
由于条目数量很多,您可能会考虑使用数据库而不是将所有内容保存在内存中。
如果你仍想把它留在记忆中,你可能会看看b树。
答案 5 :(得分:1)
您可以使用任何列表,只要它已排序,您就可以使用binary search。 但我会使用一个在O(1)中搜索的地图。
答案 6 :(得分:0)
我知道我对这个陈述非常多余,但正如大家所说的那样,地图的确如此吗?