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

时间:2015-07-08 10:59:15

标签: java collections time-complexity

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

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

有没有办法通过重用可用的集合在Java中执行此操作?或者至少是一个具有类似复杂性的解决方案......

this question中,建议Map可以解决此问题。但根据我的理解,没有Map可以正确处理重复键。

3 个答案:

答案 0 :(得分:4)

如果我理解正确的问题,你需要一个MultiMap。 GuavaCommons-Lang中有一些实现,或者您可以使用例如{3}}。一个HashMap(或TreeMap,如果你怀疑你的Array实现太慢或太差,但我先做基准测试)和一个List或Set实现作为值类型。

请注意,如果您希望迭代基于名称顺序的值,您最好使用基于树的Multimap:如果名称已经是关键,那么您的订单将是什么你想要的,无需做任何其他事情。

答案 1 :(得分:2)

正如你自己所说,地图会帮助你。对于重复的键,您应该将对象列表存储为值而不是对象本身。为此,您可以很好地使用Generics来存储对象或对象列表。

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

答案 2 :(得分:2)

如果您同意为每个实体生成唯一ID,则应使用由名称和唯一ID组成的复合键。使密钥按名称进行比较,然后按ID进行分解。

然后您只需使用普通TreeMap进行存储和检索。特别注意NavigableMap API,它可以让您找到密钥的最佳匹配,而不考虑ID部分的差异。