2013-03-27 37 views
3

我想檢查一個數組是否是另一個數組的子集。Java containsAll不會在給定列表時返回true

該程序打印錯誤,但我認爲是正確的。爲什麼不包含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); 
+0

@EricLeschinski,這就是SO存在的原因。 – 2013-03-27 16:49:53

回答

12

中有個微妙的問題:

new HashSet(Arrays.asList(subset)); 

上面一行做創建一個整數集你可能已經預期。而是使用單個元素subset陣列創建HashSet<int[]>

這與泛型不支持原始類型的事實有關。

如果您聲明sublistsuplist爲,那麼您的編譯器會告訴您這個錯誤。

最重要的是,您得到了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); 

一個重要的變化是,這是地方的int[]使用Integer[]

+0

非常好!非常感謝。 – MTT 2013-03-27 16:57:10

0

離開一邊您的初始化問題(通過NPE),你已經混了你的兩套和你真正想要的:

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

即不{10,20,30,40,60}包含{10,20,30}? (其中,當然,它確實)

相關問題