当前位置: 首页 > 知识库问答 >
问题:

将具有相同值的数组添加到HashSet会导致重复项

狄灵均
2023-03-14

我试图创建一组int数组,问题是,如果我尝试这样做:

HashSet<int[]> s = new HashSet<int[]>();
int a1[] = {1,2,3};
int a2[] = {1,2,3};
s.add(a1);
s.add(a2)
System.out.println(s.size());

那么s有两个对象,但应该只有一个。注意:它是否是HashSet并不重要

现在如果我试着用ArrayList做这个

HashSet<ArrayList<Integer>> s = new HashSet<ArrayList<Integer>>();
ArrayList<Integer> a1 = new ArrayList<Integer>();
ArrayList<Integer> a2 = new ArrayList<Integer>();
a1.add(1);
a1.add(2);
a1.add(3);

a2.add(1);
a2.add(2);
a2.add(3);

s.add(a1);
s.add(a2)
System.out.println(s.size());

那么s有一个对象。

我想了一种方法来避免第一个代码中的错误,并将每个数组的hashcode存储在hashset中,如下所示:

int a1[] = {0,10083,10084,1,0,1,10083,0,0,0,0};
int a2[] = {1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0,2112};
HashSet<Integer> s= new HashSet<Integer>();//hashcodes of each array
s.add(Arrays.hashCode(a1));
s.add(Arrays.hashCode(a2));
System.out.println(Arrays.hashCode(a1));
System.out.println(Arrays.hashCode(a2));
System.out.println(s.size());

它适用于第一种情况(1,2,3),但在有碰撞的情况下它不起作用,所以我必须管理碰撞。所以,我认为我正在做的是自己实现一个HashSet。

使用哈希集

我的问题是为什么java不允许管理哈希集

最后,如果我想做一个HashSet

谢谢

更新:好的,最后我想我得到了一个完整的答案。正如@ZiyaoWei和@user1676075所评论的,它不起作用,因为equals返回false,而hashcode是不同的。但是,为什么java不重写这些方法(使用Arrays.equals()、Arrays)。hashCode())这样就可以做HashSet之类的事情了

下面是在hashCode中使用可变字段的精彩解释http://blog.mgm-tp.com/2012/03/hashset-java-puzzler/hashmaps中的可变键是一种危险的做法吗?

我的答案是,如果你想使用哈希集

谢谢大家!

共有2个答案

燕青青
2023-03-14

哈希设置的原因是什么

当您尝试对数组执行相同的操作时。有关Java数组比较的更多详细信息,请参阅Java中的这篇文章:equals vs Arrays.equals。当您插入两个数组时,默认的. equals()测试它们是否是相同的对象,而它们不是。因此它失败了。

申屠项明
2023-03-14

这与一天结束时的碰撞无关:

a1.equals(a2) == false

由于它们不相等,一个Set将把它们视为不同的。

注意Java中的Array不会重写Object中的equals方法。

由于Set中的add被定义为

更正式地说,如果集合不包含元素e2,则将指定的元素e添加到该集合中,使得(e==null?e2==null:e.equals(e2))

在不违反某些约定的情况下,似乎不可能正确地实现一个可能满足您需求的集合(将元素与数组进行比较。equals)。

 类似资料:
  • Spark-Scala环境中的函数有一些问题。我想在我的DataFrame中添加一个新列,如下所示: 变成: 但是Spark返回给我这个错误: 你能帮我吗?非常感谢!

  • 我试图将一个数组的值添加到一个已经存在的数组中,该数组已经有一个值。我的方法是创建一个新的数组,其长度为已有数组的长度+我要添加的值的长度。然后,我只需循环整个数组,并将值添加到新数组的索引中。我的方法如下所示: null 我想不出解决办法

  • 请考虑下面的代码: 将给出1,因为HashSet不允许重复,所以只存储一个元素。 我想知道如果我们添加了重复的元素,那么它是替换了前面的元素,还是根本没有添加它? 另外,对于相同的情况,使用会发生什么?

  • 下面是产生散列集大小为3而不是2的代码 您可以看到这两个对象在输出中具有相同的代码,但被计算为不同的,并且产生的代码被计算为3 请协助我如何工作。

  • 问题内容: 请考虑以下代码: 将给出1,因为不允许重复,因此将只存储一个元素。 我想知道是否要添加重复元素,然后它会替换前一个元素还是根本不添加它? 另外,在相同情况下使用会发生什么? 问题答案: 在的情况下,它将旧值替换为新值。 如果是,则不会插入该项目。

  • 我有一个以编程方式定义的UISegmentedControl。 我正在尝试添加一个布局约束,以便在我的iPad旋转时,分段控件在旋转视图中的大小正确,而不是溢出屏幕。 我应用以下约束: 我的UIsegmentControl定义如下: 我没有出错,但是在运行时,我的分段控件消失了。不确定我在这里错过了什么,因为我过去只在故事板中做过自动布局。 我只想能够调整分段控件的宽度,所以我假设我只需要一个布局