HashSet 与 int 数组的用法
HashSet usage with int arrays
因为我有一个包含重复项的 int 数组的 ArrayList,所以我想使用 HashSet。不幸的是,我无法如愿使用 HashSet:
System.out.print("\nTESTs\n");
ArrayList<int[]> list = new ArrayList<int[]>();
list.add(new int[]{1,2,3});
list.add(new int[]{5,1,1});
list.add(new int[]{1,2,3});//duplicate
list.add(new int[]{5,1,3});
Set<int[]> set = new HashSet<int[]>(list);
System.out.println("Size of the set = "+set.size());
ArrayList<int[]> arrayList = new ArrayList<int[]>(set);
System.out.println("Size of the arrayList = "+arrayList.size());
for (int[] array:arrayList){
System.out.println(Arrays.toString(array));
}
结果是:
Size of the set = 4
Size of the arrayList = 4
[1, 2, 3]
[1, 2, 3] // duplicate still here
[5, 1, 1]
[5, 1, 3]
谁能告诉我哪里错了?
提前致谢
多米尼克(java 新手)
数组不会覆盖 Object
class 中实现的 hashCode
和 equals
,因此,两个数组 a1 和 a2 将被视为彼此相同通过 HashSet
仅当 a1==a2 时,这在您的情况下是错误的。
如果您使用 ArrayList
s 而不是数组,您的问题将得到解决,因为 ArrayList
s 的相等性取决于列表成员的相等性(以及列表成员的顺序他们出现了)。
将每个数字单独相加。不要添加 Arrays to HashSet
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1==arr2);//false
System.out.println(arr1.equals(arr2)); //false
具有相同值的两个数组不必是equal
(它们使用默认值 equals()
定义在Object
中的方法比较引用.)
这是因为 HashSet
使用 .equals()
来查看新对象是否重复(并使用 .hashCode()
来确定 "bucket")。
当您使用数组时,请注意 new int[]{1,2,3}
不是 "equal to" new int[]{1,2,3}
。
"deep compare" 数组的正确方法是通过 Arrays.equals(a, b)
方法。
为了有效地解决您的问题情况,您应该创建一个包含您的 int[]
数组的包装器 class,然后正确地实现 .hashCode()
和 equals()
。
因为我有一个包含重复项的 int 数组的 ArrayList,所以我想使用 HashSet。不幸的是,我无法如愿使用 HashSet:
System.out.print("\nTESTs\n");
ArrayList<int[]> list = new ArrayList<int[]>();
list.add(new int[]{1,2,3});
list.add(new int[]{5,1,1});
list.add(new int[]{1,2,3});//duplicate
list.add(new int[]{5,1,3});
Set<int[]> set = new HashSet<int[]>(list);
System.out.println("Size of the set = "+set.size());
ArrayList<int[]> arrayList = new ArrayList<int[]>(set);
System.out.println("Size of the arrayList = "+arrayList.size());
for (int[] array:arrayList){
System.out.println(Arrays.toString(array));
}
结果是:
Size of the set = 4
Size of the arrayList = 4
[1, 2, 3]
[1, 2, 3] // duplicate still here
[5, 1, 1]
[5, 1, 3]
谁能告诉我哪里错了?
提前致谢 多米尼克(java 新手)
数组不会覆盖 Object
class 中实现的 hashCode
和 equals
,因此,两个数组 a1 和 a2 将被视为彼此相同通过 HashSet
仅当 a1==a2 时,这在您的情况下是错误的。
如果您使用 ArrayList
s 而不是数组,您的问题将得到解决,因为 ArrayList
s 的相等性取决于列表成员的相等性(以及列表成员的顺序他们出现了)。
将每个数字单独相加。不要添加 Arrays to HashSet
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1==arr2);//false
System.out.println(arr1.equals(arr2)); //false
具有相同值的两个数组不必是equal
(它们使用默认值 equals()
定义在Object
中的方法比较引用.)
这是因为 HashSet
使用 .equals()
来查看新对象是否重复(并使用 .hashCode()
来确定 "bucket")。
当您使用数组时,请注意 new int[]{1,2,3}
不是 "equal to" new int[]{1,2,3}
。
"deep compare" 数组的正确方法是通过 Arrays.equals(a, b)
方法。
为了有效地解决您的问题情况,您应该创建一个包含您的 int[]
数组的包装器 class,然后正确地实现 .hashCode()
和 equals()
。