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