2016-12-09 10 views
0

사용자 정의 ComparatorTreeSet의 도움으로 목록에서 중복 객체를 제거하려고합니다. 콘솔TreeSet의 객체 유형에 대해 비교자가 작동하지 않습니다.

class ASDF { 
    int i 
    Pass ref 
    new(Pass p, int i) { 
     this.ref = p 
     this.i=i 
    } 
    public static def void main(String[] args) { 
     val list = new TreeSet(
      new Comparator<ASDF> { 
       override compare(ASDF obj1, ASDF obj2) { 
        if (obj1.ref == obj2.ref && obj1.i == obj2.i) { 
         return 0 
        } 
        return 1 
       } 
      } 
     ) 
     val a1 = new ASDF(new Pass("p1"), 1) 
     val a2 = new ASDF(new Pass("p2"), 2) 
     val a3 = new ASDF(new Pass("p3"), 3) 
     val a4 = new ASDF(new Pass("p4"), 4) 
     list.addAll(
      a1, a2, a3, a4 
      , 
      a1, a2, a3, a4 
      , 
      a1, a2, a3, a4 
      , 
      a1, a2, a3, a4 
     ) 
     println(list.map['''«ref.s»->«i»''']) 
    } 
} 

class Pass { 
    @Accessors 
    String s 
    new (String s) { 
     this.s=s 
    } 
} 

실제 출력 :이 코드 [P1-> 1, P2-> 2, P3-> 3 p4-> 4 P1-> 1, P3-> 3]

예상 콘솔 출력 : [P1-> 1, P2-> 2, P3-> 3, p4-> 4]

는 왜 세트에 다시 p1p3는 무엇입니까? Comparator에서 나는 어디가 잘못 될까요?

참고 : 이것은 단지 예제 코드 단편입니다. 당신이 Comparator의 계약을 어기면 내 '진짜'코드에서 나는 제대로 동작하는 TreeSet을 기대하지 마십시오 equals 또는 hashcode

+0

'Pass'에 적절한 equals 메소드를 구현 한 다음'obj1.ref == obj2.ref' 대신'obj1.ref.equals (obj2.ref)'를 사용하십시오. – Mritunjay

+0

그것을 시도했다. 변경 없음. – Sujju

+1

왜 컴파일 할 수있는 코드를 게시하지 않습니까? – Jobin

답변

4

을 무시할 수 없습니다. 당신은 전체 주문에 대해 걱정하지 않는다 (또는 정의 할 수 없습니다) 경우

Pass p1 = new Pass("p1"); 
Pass p2 = new Pass("p2"); 
compare(p1, p2); // returns 1 
compare(p2, p1); // also returns 1 - not good 

, 당신은 훨씬 더와 함께 할 것 :

은 즉, 여기에는 비교 대칭를 만들기 위해 실패 적절하게 정의 된 hashCode()equals()HashSet. (당신이 쓰는대로) 당신을 대체 할 수없는 경우

는 관련 특성을 보유 할 Key 클래스를 생성 KeyhashCode()equals()을 정의하고 HashMap<Key, Pass>를 사용합니다. 또는 KeyPass에 대한 참조를 보유하는 래퍼 일 수 있으며 Pass '필드의 해시 코드와 같음을 가져옵니다.

1

compare(a, b)이 양의 정수를 반환하면 Comparator의 계약을 위반하는 것이므로 음수를 반환해야합니다. compare(b, a) 전이 비교 같은 다른 요구 사항 외에도. 구현시이 계약을 따르지 않는 0 또는 1을 반환하므로 TreeSet은 물론 제대로 작동하지 않습니다.

+0

이상하게도, OP는 다른 요소에 대해 항상 1을 반환하므로 'a < b < c =>

+0

알다시피 방금 언급 했으므로 비교자를 다시 구현할 때이를 고려합니다. :-) – Vampire