可搜索的Java对象列表

时间:2010-03-26 14:18:05

标签: java list search

我想创建一个大型(~300,000个条目)类Drug的自定义对象列表。 每种药物都有一个ID,我希望能够通过该ID在对数时间内搜索药物。 我必须使用什么样的清单? 我如何声明它可以通过ID搜索?

7 个答案:

答案 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)

我知道我对这个陈述非常多余,但正如大家所说的那样,地图的确如此吗?