给定列表时,Java containsAll不返回true

时间:2013-03-27 16:41:44

标签: java contains subset hashset

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

该程序打印错误,但我希望是真的。为什么不包含所有返回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);

2 个答案:

答案 0 :(得分:12)

有一个微妙的错误:

new HashSet(Arrays.asList(subset));

以上行创建一组您可能预期的整数。相反,它会创建一个HashSet<int[]>,其中包含一个元素subset数组。

这与泛型不支持基本类型的事实有关。

如果您将sublistsuplist声明为HashSet<Integer>,您的编译器会告诉您错误。

最重要的是,suplist来电中sublistcontainsAll()方向错误。

以下按预期方式工作:

    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[]

答案 1 :(得分:0)

放在一边你的初始化问题(由NPE确定),你已经混淆了你的两套,你真的想要:

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

即。 {10,20,30,40,60}是否包含{10,20,30}? (当然,它确实如此)