Я пытаюсь устранить повторяющиеся объекты из списка с помощью TreeSet
с пользовательским Comparator
. Для этого кода:Компаратор не работает для типов объектов в 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, р2> 2, p3-> 3, p4-> 4, P1-> 1, p3-> 3]
Ожидаемые результаты на консоли: [P1-> 1, р2> 2, p3-> 3, p4-> 4]
Почему я получаю p1
и p3
снова в наборе? Где я ошибаюсь в Comparator
?
Примечание: это всего лишь пример фрагмента кода. В моей «реальной» код, который я не могу переопределить equals
или hashcode
Что касается реализации правильного метода равенства для 'Pass', тогда используйте' obj1.ref.equals (obj2.ref) 'вместо' obj1.ref == obj2.ref'. – Mritunjay
Пробовал, что. Без изменений. – Sujju
Почему вы не отправляете код, который компилируется .. – Jobin