我有一个像这样的Java类
public class A {
private String field1;
private String field2;
// getters, setters but no equals and hashcode
}
和此类的对象列表,我想从该列表中删除具有相同field1或相同field2的所有重复元素,因此我有2个比较器
public class Comparator1 implements Comparator<A> {
public int compare(A o1, A o2) {
return o1.getField1().compareToIgnoreCase( o2.getField1() );
}
}
public class Comparator2 implements Comparator<A> {
public int compare(A o1, A o2) {
return o1.getField2().compareToIgnoreCase(o2.getField2());
}
}
所以要做任务,我使用树集
TreeSet<A> ts1 = new TreeSet<A>(new Comparator1())
ts1.addAll(list)
TreeSet<A> ts2 = new TreeSet<A>(new Comparator2())
ts2.addAll(ts1)
list.clear()
list.addAll(ts2)
但是我怎么能只用一个比较器和一个树集来做同样的事情呢?
谢谢您的帮助
更新:
感谢所有人的答案,但是在阅读它们之后,我不知道这是否是解决实际问题的正确方法。
在我的真实情况下,field1就像电话号码,而field2就像名字。
因此,我不想多次拨打相同的电话号码(这是删除重复项的第一个树集),并且我不想多次拨打同一名称(第二个删除重复项的树集)
您可以修改类,但我想知道这种方法是否可以解决实际问题。
如果这种方法是正确的,从您的问题来看,我看到不修改类就不能仅使用一个比较器
谢谢
最佳答案
您不能,而且我不清楚您要做什么是明确定义的。
您是否知道当前的方法取决于添加元素的顺序以及是否首先检查field1或field2是否重复?假设您有以下A类对象:
A ab = new A("a", "b");
A cb = new A("c", "b");
A cd = new A("c", "d");
首先检查field1会得出结果
[ab]
或[ab, cd]
,具体取决于添加的顺序。首先检查field2会得出结果
[cb]
或[ab, cd]
,具体取决于添加的顺序。这是很奇怪的行为。这是您想要的吗?在一般情况下,我认为不可能使用单个TreeSet和Comparator来重现此内容。