我希望使用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);
listComCopy
是一个对象列表。
它完成了工作,但它只比较了列表中的连续对象,所以如果我有list(50).equals(list(150))
,它将会忽略。
您是否知道如何重构此代码以消除列表中无序的所有重复项?
答案 0 :(得分:3)
根据TreeSet的构造函数javadoc:
TreeSet(比较器比较器)
构造一个新的空树集,根据指定的比较器进行排序。
您提供的比较器仅用于排序,而不是用于重复删除。
如果要删除重复项,则应在要存储在此TreeSet上的对象类上实现.equals()
和.hashcode()
,因此在添加新的时,重复删除逻辑将立即生效它的元素。
答案 1 :(得分:2)
您的compare
方法不符合要求。
见Comparator.compare ...
比较其订单的两个参数。返回负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。
最好在compare
中使用String.compareTo。
Set<Object> s = new TreeSet<>(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
});
答案 2 :(得分:1)
您可能希望使用compareTo方法而不是使用equals方法来比较字符串。这将允许树集构建一个真实的树状结构。
答案 3 :(得分:1)
您应该重新考虑Comparator
实施。来自java.util.Comparator#compare
javadoc:
@return一个负整数,零或一个正整数作为 *第一个参数小于,等于或大于 *第二。
您永远不会在代码中返回负数,请将return o1.toString().compareTo(o2.toString())
视为Comparator
实施