2013-03-27 2 views
3

배열을 검사하고 싶습니다. 다른 배열의 하위 집합입니다.Java containsAll이 지정된 목록이 true 일 때

프로그램에서 false를 인쇄하지만 사실이라고 생각합니다. containsAll이 true를 돌려주지 않는 이유는 무엇입니까? (NPE로 식별)

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가 존재하는 이유입니다. –

답변

12

(이, 물론 그렇습니다). 대신 HashSet<int[]>이라는 단일 요소 인 subset 배열을 만듭니다.

이것은 제네릭이 기본 유형을 지원하지 않는다는 사실과 관련이 있습니다.

sublistsuplist을 으로 선언하면 컴파일러에서 실수에 대해 이야기했을 것입니다.

이 외에도 containsAll() 전화에서 suplistsublist의 길이 잘못되었습니다.

다음 작품은 예상대로 :

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

0

옆 당신의 초기화 문제를 을 떠나, 당신은 당신의 두 가지를 혼합 한 당신은 실제로 원하는 :

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

{10,20,30,40,60}{10,20,30}을 즉 포함되어 있습니까?

new HashSet(Arrays.asList(subset)); 

위의 라인이하는 하지 당신이 예상했을 수도로 정수의 집합을 만들 : 미묘한 버그가 있습니다

관련 문제