使用Java Collections最大化按人名排序的数据结构的效率



我需要一个按人名映射的数据结构,这意味着必须存储重复的键。我希望有log(n)次(最多)的插入,删除和搜索。

理想情况下,我会有一个由唯一标识符映射的Hashtable,该标识符将在插入时生成。通过这样做,我可以在常数时间内插入。有了一个辅助的有序平衡树,其中每个条目都是对哈希表中一个条目的引用,我将能够在对数时间内按名称搜索/删除,并在线性时间内按名称排序打印所有条目。

在Java中是否有一种方法通过重用可用的集合来做到这一点?或者至少有一个类似复杂性的解决方案…

在这个问题中,建议使用Map来解决这个问题。但是从我的理解来看,没有Map可以正确地处理重复的键。

如果我理解正确的话,您需要一个MultiMap。在Guava和Commons-Lang中有一些实现,或者你可以使用HashMap(或者TreeMap,如果你怀疑你的.hashCode()实现太慢或太差,但我会先基准测试)和List或Set实现作为值类型。

注意,如果你想迭代基于名称顺序的值,你最好使用基于树的Multimap:如果名称已经是键,你的顺序将是你想要的,而不需要做任何其他。

就像你自己说的,Map会帮助你。对于重复的键,您应该将对象列表存储为值而不是对象本身。为此,你可以很好地利用泛型在Value中存储对象或对象列表。

编辑:在最坏的情况下(所有条目都有相同的名称),这退化为O(n)复杂度,但这种情况应该非常非常罕见,所以应该忽略它。

如果您同意为每个实体生成唯一的ID,那么您应该使用由名称和唯一ID组成的组合键。通过名称比较键,然后通过ID来打破关系

那么您只需使用普通的TreeMap进行存储和检索。特别要注意NavigableMap API,它将允许您找到一个键的最佳匹配,而忽略ID部分的差异。

最新更新