3

我想检查一个数组是另一个数组的子集。

该程序打印错误,但我希望是真的。为什么 containsAll 不返回 true?

int[] subset;
subset = new int[3];
subset[0]=10;
subset[1]=20;
subset[2]=30;

int[] superset;
superset = new int[5];
superset[0]=10;
superset[1]=20;
superset[2]=30;
superset[3]=40;
superset[4]=60;
HashSet sublist = new HashSet(Arrays.asList(subset));
HashSet suplist = new HashSet(Arrays.asList(superset));
boolean isSubset = sublist.containsAll(Arrays.asList(suplist));
System.out.println(isSubset);
4

2 回答 2

12

有一个微妙的错误:

new HashSet(Arrays.asList(subset));

上面的行并没有像您预期的那样创建一组整数。HashSet<int[]>相反,它使用单个元素创建一个subset数组。

这与泛型不支持原始类型有关。

如果您声明sublistand suplistas ,您的编译器会告诉您错误HashSet<Integer>

最重要的是,你在电话suplistsublist走错了路containsAll()

以下按预期工作:

    Integer[] subset = new Integer[]{10, 20, 30};
    Integer[] superset = new Integer[]{10, 20, 30, 40, 60};
    HashSet<Integer> sublist = new HashSet<Integer>(Arrays.asList(subset));
    HashSet<Integer> suplist = new HashSet<Integer>(Arrays.asList(superset));
    boolean isSubset = suplist.containsAll(sublist);
    System.out.println(isSubset);

一个关键的变化是它使用Integer[]int[].

于 2013-03-27T16:43:30.200 回答
0

撇开您的初始化问题(由 NPE 确定)不谈,您已经混合了两组并且您实际上想要:

boolean isSubset = suplist.containsAll(Arrays.asList(sublist));

{10,20,30,40,60}包含{10,20,30}?(当然,确实如此)

于 2013-03-27T16:43:17.350 回答