我有一个对象列表。
List<MyObject> myList;
此列表在开头填充,之后不再进行更新。
列表中对象的顺序非常重要,因为我需要稍后按顺序迭代此列表。
在执行我的程序时,我经常需要在MyObject
中找到给定myList
的索引;
我知道我可以使用myList.indexOf(object)
,但我担心性能问题。因此,我将使用HashMap
将MyObject
中的每个myList
映射到myList
中的索引,以便我可以非常有效地找到索引。
但我不确定我是否遗漏了一些微不足道的东西,我将使用两个带有冗余数据的容器,我可以使用不同的容器轻松完成这项工作。
那么,任何人都可以看到更好的方法吗?
答案 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>
。