사용자 정의 Comparator
인 TreeSet
의 도움으로 목록에서 중복 객체를 제거하려고합니다. 콘솔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]
는 왜 세트에 다시 p1
및 p3
는 무엇입니까? Comparator
에서 나는 어디가 잘못 될까요?
참고 : 이것은 단지 예제 코드 단편입니다. 당신이 Comparator
의 계약을 어기면 내 '진짜'코드에서 나는 제대로 동작하는 TreeSet
을 기대하지 마십시오 equals
또는 hashcode
'Pass'에 적절한 equals 메소드를 구현 한 다음'obj1.ref == obj2.ref' 대신'obj1.ref.equals (obj2.ref)'를 사용하십시오. – Mritunjay
그것을 시도했다. 변경 없음. – Sujju
왜 컴파일 할 수있는 코드를 게시하지 않습니까? – Jobin