【发布时间】:2016-12-09 12:16:04
【问题描述】:
我正在尝试借助 TreeSet 和自定义 Comparator 从列表中消除重复对象。
对于此代码:
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 哪里出错了?
注意:这只是一个示例代码 sn-p。在我的“真实”代码中,我无法覆盖 equals 或 hashcode
【问题讨论】:
-
如何为
Pass实施适当的equals 方法,然后使用obj1.ref.equals(obj2.ref)而不是obj1.ref == obj2.ref。 -
试过了。没有变化。
-
为什么不发布一些可编译的代码..
-
obj1.ref == obj2.ref。试试.equals()。
标签: java comparator treeset xtend