linkedHashSet中的java重复项索引
我正在向LinkedHashSet
添加一些值,并基于add()
方法的输出,即true/false,执行其他操作
如果Set
包含重复元素,则返回false,在本例中,我想知道Set
中重复元素的索引,因为我需要在其他地方使用该索引。作为一个“链接”集合,必须有某种方法来获取索引,但我在Set
/LinkedHashSet
API中找不到任何这样的东西
你可以在下面搜索框中键入要查询的问题!
我正在向LinkedHashSet
添加一些值,并基于add()
方法的输出,即true/false,执行其他操作
如果Set
包含重复元素,则返回false,在本例中,我想知道Set
中重复元素的索引,因为我需要在其他地方使用该索引。作为一个“链接”集合,必须有某种方法来获取索引,但我在Set
/LinkedHashSet
API中找不到任何这样的东西
# 1 楼答案
LinkedHashSet
本身没有显式索引。如果你需要一个索引,在这样的应用程序中使用Set
通常是错误的抽象和/或糟糕的编程的标志LinkedHashSet
只保证可预测的迭代顺序,而不是元素的正确索引。在这种情况下,应该使用^{a)在集合中使用索引迭代(例如,使用
for
循环),寻找重复项,并在发现时中断;获取索引是O(n)复杂度b) 使用
.toArray()
并在数组中查找元素,例如同样,O(n)获取索引的复杂性
这两种方法都会带来严重的运行时损失(第二种解决方案在效率方面显然更差,因为它会在每次搜索索引时创建一个数组;在那里创建一个镜像集合的并行数组会更好)。总而言之,我在你的例子中看到了一个破碎的抽象。你说
。。。如果这是真的,那么使用
Set
本身就有99%的时间是错误的另一方面,您可以使用
Map
(HashMap
例如),其中包含[index,Object]
(或[Object,index]
,具体取决于具体的用例)对。这需要一些重构,但我更喜欢这样做。对于大多数操作来说,它的复杂性顺序与LinkedHashSet
相同,但对于基本上免费获取索引,您会得到O(1)(Java的HashSet
在内部使用HashMap
,所以用HashMap
替换HashSet
不会损失任何内存)更好的方法是使用类显式地处理整数映射——有关更多信息,请参见HashMap and int as key;tl;dr-http://trove.starlight-systems.com/有
TIntObjectHashMap
&TObjectIntHashMap
,为您提供此类操作可能的最佳速度