我有一个像这样的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来重现此内容。

09-29 21:25