Java树集基于对象属性删除重复项

Java树集基于对象属性删除重复项,java,comparator,treeset,Java,Comparator,Treeset,我希望使用TreeSet删除基于属性的重复对象(这里是返回对象名称的toString()),下面是我的代码: Set<Object> s = new TreeSet<>(new Comparator<Object>() { @Override public int compare(Object o1, Object o2) { if (o1.toString()

我希望使用
TreeSet
删除基于属性的重复对象(这里是返回对象名称的
toString()
),下面是我的代码:

Set<Object> s = new TreeSet<>(new Comparator<Object>() {          
            @Override
            public int compare(Object o1, Object o2) {
                if (o1.toString().equals(o2.toString())) {
                    return 0;
                } else {
                    return 1;
                }
            }
        });
s.addAll(listComCopy);
listComCopy.clear();
listComCopy.addAll(s);
Set s=new TreeSet(new Comparator(){
@凌驾
公共整数比较(对象o1、对象o2){
如果(o1.toString()等于(o2.toString()){
返回0;
}否则{
返回1;
}
}
});
s、 addAll(listComCopy);
listComCopy.clear();
listComCopy.addAll(s);
listComCopy
是一个对象列表

它完成了这项工作,但它只比较列表上的连续对象,因此如果我有
list(50).equals(list(150))
它将忽略


您知道如何重构此代码以消除所有重复项,而不考虑它们在列表中的顺序吗?

您可能希望使用compareTo方法而不是equals方法来比较字符串。这将允许树集构建实际的树状结构。

根据TreeSet的构造函数:

树集(比较器比较器)
构造一个新的空树集,根据指定的比较器进行排序

您提供的比较器仅用于排序,不用于删除重复项


如果要删除重复项,应在存储在此树集中的对象类上实现
.equals()
.hashcode()
,因此在向其添加新元素时,重复项删除逻辑将立即生效。

您应重新考虑
比较器的实现。从
java.util.Comparator#compare
javadoc:

@返回一个负整数、零或正整数作为 *第一个参数小于、等于或大于 *第二


您在代码中从不返回负数,请考虑<代码>返回O1.toStRun()。COMPARETO(O2toStrug())< /C> >作为您的代码>比较器< /C> >实现< /P> < P> > <代码>比较方法不遵守要求。< /P> 看

比较其两个参数的顺序。当第一个参数小于、等于或大于第二个参数时,返回一个负整数、零或正整数

您最好在
比较中使用

    Set<Object> s = new TreeSet<>(new Comparator<Object>() {
        @Override
        public int compare(Object o1, Object o2) {
            return o1.toString().compareTo(o2.toString());
        }
    });
Set s=新树集(新比较器(){
@凌驾
公共整数比较(对象o1、对象o2){
返回o1.toString().compareTo(o2.toString());
}
});

在Java8中,您可以使用
新树集(Comparator.comparing(Object::toString))
也许您应该重新阅读链接的文档,尤其是“a
TreeSet
实例使用其
compareTo
(或
compare
)方法执行所有元素比较”+1的部分,构造函数javadoc具有误导性,有些人可能会认为TreeSet由于不使用equals和hashcode而破坏了Set约定。你真丢脸,java。文档中明确指出,
TreeSet
在顺序与
等于
不一致的情况下,无法遵守
集合
接口的总合同。散列码是不相关的,因为它不是一般
集合
契约的一部分(如果
散列码
等于
不一致,则可以说
散列码
未能遵守
集合
契约)…