使用int数组的HashSet用法

时间:2015-02-05 12:44:02

标签: java hashset

由于我有一个包含重复项的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新手)

3 个答案:

答案 0 :(得分:8)

数组不会覆盖hashCode类中实现的equalsObject,因此,{{1}将认为两个数组a1和a2彼此相同仅当a1 == a2时,在你的情况下为假。

如果使用HashSet而不是数组,则问题将得到解决,因为ArrayList的相等性取决于列表成员的相等性(以及它们出现的顺序) )。

答案 1 :(得分:1)

这是因为HashSet使用.equals()来查看新对象是否重复(以及.hashCode()来确定“存储桶”)。

使用数组时,请注意new int[]{1,2,3}并非“等于”new int[]{1,2,3}

“深度比较”数组​​的正确方法是通过Arrays.equals(a, b)方法。

要有效地解决您的问题,您应该创建一个包含int[]数组的包装类,然后正确实现.hashCode()equals()

答案 2 :(得分:0)

单独添加的每个号码。不要添加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方法来比较引用 。)