我试图创建一组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中的可变键是一种危险的做法吗?
我的答案是,如果你想使用哈希集
谢谢大家!
哈希设置的原因是什么
当您尝试对数组执行相同的操作时。有关Java数组比较的更多详细信息,请参阅Java中的这篇文章:equals vs Arrays.equals。当您插入两个数组时,默认的. equals()测试它们是否是相同的对象,而它们不是。因此它失败了。
这与一天结束时的碰撞无关:
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定义如下: 我没有出错,但是在运行时,我的分段控件消失了。不确定我在这里错过了什么,因为我过去只在故事板中做过自动布局。 我只想能够调整分段控件的宽度,所以我假设我只需要一个布局