2017-01-18 8 views
0

트리 세트를 초기화하기 위해 자체 정의 된 비교기를 사용하여 min-heap으로 만듭니다. 1, 2, 3과 같은 작은 숫자의 중복을 제거하는 데는 문제가 없습니다. 그러나 숫자가 클 경우 트리 집합에 중복이 남아 있습니다. 여기에 내 코드입니다 : 나는 자바 테스트 -2147483647 -2147483647 1 일을 할 경우Comparator가 TreeSet의 중복 수를 제거하지 않습니다.

public class Test { 
    public static void main(String[] args) { 
      Set<Integer> treeset = new TreeSet<>(new MyComparator()); 
      Integer[] array = new Integer[args.length]; 
      for (int i = 0 ; i < args.length ; i ++) { 
        array[i] = Integer.valueOf(args[i]); 
        treeset.add(array[i]); 
      } 
      for (Integer i : treeset) { 
        System.out.print(i + " "); 
      } 
    } 

    public static class MyComparator implements Comparator<Integer> { 
      @Override 
      public int compare(Integer i1, Integer i2) { 
        if (i1 < i2) { 
          return -1; 
        } else if (i1 == i2) { 
          return 0; 
        } else { 
          return 1; 
        } 
      } 
    } 

}

, 나는 -2147483647 -2147483647 1. 얻을 그것은 뭔가 것 같아 나의 비교에 문제가 있습니다. 나는 디버그를 시도했다. -2147483647과 -2147483647을 비교하면 0을 반환하는 대신 compare 메서드가 1을 반환합니다. 누군가가 내게 이유를 알려주시겠습니까? 미리 감사드립니다.

답변

1

Integer의 인스턴스를 ==으로 비교하지만 객체에 적용된 ==은 비교되며 인스턴스가 동일한 경우에만 비교됩니다. 귀하의 경우 i1i2은 동일한 가치를 지니고 있지만 두 개의 다른 인스턴스입니다. 하는 것을 피하기 위해 Integer 클래스 캐시 작은 정수 (기본적으로 127 -128) :

... 
       } else if (i1,equals(i2)) { 
         return 0; 
... 

이 왜 적은 수의 작업 않습니다

는에 같은 내용을 비교하기 위해 equals 방법을 사용 필요하면 매번 새로운 인스턴스를 생성하십시오. 세부 사항 : Integer.valueOf(int)

+0

저는 equals()로 바뀌 었습니다. 고맙습니다! –

0

valueOf()을 사용하여 Integer을 만들 때 값은 -128에서 127 사이에서 캐시됩니다. 이는 비교를 위해 연산자 ==을 사용하는 이러한 범위의 값이 두 객체가 동일한 정수 값을 갖는 경우 true을 반환 함을 의미합니다. 작동하지 않는 정수 값이 -128보다 작고 127보다 큰 경우 비교는 동일한 값을 갖는 객체에 대해 false을 반환합니다. 항상 올바르게 작동하게하려면 == 대신 equals() 방법을 사용하십시오.

+0

멋진 설명! 고맙습니다! –