当前位置: 首页 > 面试题库 >

HashSet与int数组的用法

俞子实
2023-03-14
问题内容

因为我有一个包含重复项的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]

有人可以告诉我我错了吗?

在此先感谢Dominique(java newbie)


问题答案:

数组不会在类中重写hashCodeequals实现Object,因此,HashSet只有当a1 == a2时,两个数组a1和a2
才被视为彼此相同,这在您的情况下是错误的。

如果使用ArrayLists而不是数组,则将解决问题,因为对于ArrayLists而言,相等性取决于列表成员的相等性(及其出现的顺序)。



 类似资料:
  • 问题内容: 我有一个整数数组: 我需要一个类型集: 如果我执行以下操作: 它当然认为我的意思是: 而我的意思是: 这是因为int是基元。如果我使用过String,那么一切都会起作用: 如何轻松,正确和简洁地从以下位置进行: 至 谢谢! 问题答案: 一些进一步的解释。asList方法具有此签名 因此,如果您这样做: 或这个: 在这些情况下,我相信Java能够推断出您想要返回一个List,因此它会填充

  • 问题内容: 我有一个和一帮在里面。我想把它变成一个数组,但是打电话 返回。除了手动遍历每个元素,还有更好的方法将其转换为其他数组吗?我想将数组传递给 即使我尝试将其像强制转换那样也不会接受Object []数组 问题答案: Apache的ArrayUtils具有以下功能(它仍在幕后进行迭代): 它们始终是检查此类事情的好地方。

  • 问题内容: 两者之间有区别吗 和 ? 两者都起作用,并且结果完全相同。哪个更快或更更好?是否有推荐的风格指南? 问题答案: 两者是等效的。看一下以下内容:

  • 之间有区别吗 和 ? 两者都起作用,结果完全相同。哪一个更快或更好?有推荐的款式指南吗?

  • 问题内容: 使用,为什么它对(原始类型)和数组显示不同的列表大小? a)对于数组,每当我执行以下程序时,列表大小= 1 b)但是,如果我从数组类型更改为array(如),则列表大小为4,我认为这是正确的。 PS :使用(包装类)数组,则结果很好,但是我不确定为什么在原始数组中列表大小为1。请解释。 问题答案: 由于Java泛型而无法保存原始值(请参阅类似的问题)。因此,当您调用Arrays 时,将

  • 使用,为什么它显示(原始类型)和数组的不同列表大小? a) 使用array,每当我执行以下程序时,列表大小=1 b) 但是如果我从数组类型更改为数组(比如),那么我得到的列表大小是4,我认为是正确的。 PS:使用(包装类)数组,结果就可以了,但我不确定为什么在primitive数组中,列表大小是1。请解释一下。