是否可以使用HashMap保留列表元素的索引?

时间:2015-05-15 12:46:47

标签: java data-structures

我有一个对象列表。

List<MyObject> myList;

此列表在开头填充,之后不再进行更新。

列表中对象的顺序非常重要,因为我需要稍后按顺序迭代此列表。

在执行我的程序时,我经常需要在MyObject中找到给定myList的索引;

我知道我可以使用myList.indexOf(object),但我担心性能问题。因此,我将使用HashMapMyObject中的每个myList映射到myList中的索引,以便我可以非常有效地找到索引。

但我不确定我是否遗漏了一些微不足道的东西,我将使用两个带有冗余数据的容器,我可以使用不同的容器轻松完成这项工作。

那么,任何人都可以看到更好的方法吗?

4 个答案:

答案 0 :(得分:3)

您可以使用LinkedHashMap来包含MyObject个实例。

Map<String, MyObject> map = new LinkedHashMap<String, MyObject>();
  

使用Hash表和Map接口的链表实现   可预测的迭代顺序。

这将允许您有1个集合同时执行这两个。

答案 1 :(得分:0)

使用hashMap的查找时间复杂度为O(1),访问具有已知索引的数组也有O(1),这意味着查找和访问对象将导致O(1)。你不能那么快。

当涉及到空间时,你有两个结构时你的空间加倍,而HashMap甚至会占用更多空间,因为它需要填充整个哈希范围,但它仍然只在O(n)中。

我认为这是一种很好的方法,但正如已经说过的那样LinkedHashMap会自动为你做这件事。

答案 2 :(得分:0)

您可以使用LinkedHashMap代替List来解决所有问题。最初,您可以像这样初始化Map

Map<MyObject, Integer> map = new LinkedHashMap<>();
//...
map.put(myObject1, map.size()); //saves myObject1 and index as 0
map.put(myObject2, map.size()); //saves myObject2 and index as 1
map.put(myObject3, map.size()); //saves myObject3 and index as 2
//...

如果MyObject.hashCode()方法实现良好,map.get(myObject)将为您提供良好的效果,并且可以帮助您避免创建额外的集合。

答案 3 :(得分:0)

使用ArrayList<MyObject> myList; O(n)需要myList.indexOf(object)查找索引(我不知道List的其他实现)所以我不会使用它,除非你能保证列表很小。

一种替代方法是使用LinkedHashMap<MyObject, Integer>,它确实会保留您将其插入地图的元素的顺序,但是丢失能够轻松地从索引中获取对象

除了原始LinkedHashMap<MyObject, Integer>之外,您还可以使用List<MyObject> myList; ,这样您既可以从对象获取索引,反之亦然,也可以按顺序遍历对象您添加了它们,但现在LinkedHashMap<MyObject, Integer>可以替换为您在第一时间建议的普通HashMap<MyObject, Integer>

Google BiMap还有Guava,所以你可以查看一下。