代码之家  ›  专栏  ›  技术社区  ›  Christian

Java中对象的可搜索列表

  •  9
  • Christian  · 技术社区  · 15 年前

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

    7 回复  |  直到 9 年前
        1
  •  4
  •   Etienne de Martel    15 年前

    映射接口的各种实现应该做您想要做的。

    如果计划使用哈希映射,请记住重写毒品类的hashcode()方法。

        2
  •  3
  •   Shervin Asgari    15 年前
    public class Drug implements Comparable<Drug> {
    
        public int compareTo(Drug o) {
             return this.id.compareTo(o.getId());
        }
    }
    

    然后在你的列表中你可以使用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;
        }
    
        3
  •  2
  •   Mike Cornell    15 年前

    你不会用treemap代替list用id作为键吗?

        4
  •  2
  •   kgiannakakis    15 年前

    如果按键搜索对您很重要,那么您可能需要使用地图而不是列表。从 Java Collections Trail :

    三大通用图 实现是hashmap、treemap 和Linkedhashmap。如果你需要 排序映射操作或键排序 集合视图迭代,使用 treemap;如果您想要最大速度和 不关心迭代顺序,使用 hashmap;如果你想靠近hashmap 性能和插入顺序 迭代,使用LinkedHashMap。

        5
  •  2
  •   Patrick Cornelissen    15 年前

    由于条目数量众多,您可能会考虑使用数据库,而不是将所有内容保存在内存中。

    如果你还想把它保存在记忆中,你可以看看B-树。

        6
  •  1
  •   idrosid    15 年前

    您可以使用任何列表,只要排序,就可以使用 binary search . 但我会使用在O(1)中搜索的地图。

        7
  •  0
  •   anilit99    15 年前

    我知道我对这句话有点多余,但正如大家所说,这不是地图的情况吗?