java - 如何从 Hashmap 中删除重复的键

标签 java hashmap duplicates

我有一个列表。列表中有一个列表。 [[-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/

相关文章:

java - 从大型未排序数组中删除重复项并保持顺序

java - 即使表包含一条记录,也获取最后一条记录

java - 加载错误 LibGDX/Scene2d

java - 等待两个 Observable 完成后再继续?

java - 用 O(nlogn) 时间 O(1) 空间有效地计算数组中等值对的数量

r - 根据条件 R 将数据帧的元素添加到另一个数据帧

java - 使用 GridLayout 时如何将组件的大小锁定在可调整大小的框架中?

python - Python 的字典映射使用什么哈希算法?

java - 使用 HashMap 的数据表示

java - 如何对列表 HashMap 进行排序?