我有一个列表。列表中有一个列表。
[[-1, 0, 1], [-1, 2, -1], [0, 1, -1]]
,该列表的名称表示结果。结果列表包含重复元素作为列表。 [-1,0,1]
和 [0,1,-1]
它们是相同的。我想制作一个不包含重复项的列表。所以列表结果变成 [[-1,0,1],[-1,2,-1]]
或 [[-1,2,-1],[0,1 ,-1]]
.
我读到 Hashmap 不能存储重复的键,但允许重复的值。因此,为了删除重复项,我尝试了 Hashmap。
但是编写代码后运行良好,没有错误。
HashMap<List<Integer>,Integer> final_sol=new HashMap<>();
for(int k1=0;k1<result.size();k1++){
final_sol.put(result.get(k1),k1);
}
System.out.println(final_sol);
输出:
{[-1, 2, -1]=1, [0, 1, -1]=2, [-1, 0, 1]=0}
编写此代码块后,我认为我的重复键无法显示,只能显示唯一的键。
那么我怎样才能使用 HashMap 使这个列表唯一呢? Fail to understand
当我使用树形图时,它无法编译并给出一些错误。
最佳答案
确实,Map 不保留重复的键,Set 不保留重复的元素,但您需要了解“重复”是根据键/元素 equals()
方法定义的,基于哈希的集合依赖于其键/元素具有与其 equals()
方法一致的 hashCode()
方法。
现在你说
[-1,0,1]
and[0,1,-1]
they are same.
,但不,就 List
的相等定义而言,它们不相同。列表元素的顺序很重要,列表需要以反射(reflect)这一点的方式实现 equals() 。这就是为什么这两个列表可能在同一个 Map
中显示为键,并且都可能在同一个 Set
中显示为元素。
Then how could I make this list unique using Hash map?
显然顺序对于您的目的来说并不重要,因此列表并不是真正适合您使用的模型。如果您不需要容纳重复的元素,那么您应该考虑使用集合。标准库提供了几种实现,据我了解,其中 HashSet
可能最适合您的情况。如果您确实需要容纳重复的元素,那么您正在寻找多重集。标准库没有提供实现,但第三方提供了一些实现。
When I was using tree map it doesn't compile and gave some error.
嗯,是的,会的,除非您为其提供了一个Comparator
来确定元素的相对顺序。 TreeMap
将重复项识别为根据其自然顺序或比较器指定的顺序比较相等的键。
总的来说,听起来您需要一组集合或一组多重集合,而不是列表的列表。我不明白你为什么要把 map 带进去。
关于java - 如何从 Hashmap 中删除重复的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54487845/