Java TreeSet根据对象属性删除重复项

时间:2016-06-14 13:18:57

标签: java comparator treeset

我希望使用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)),它将会忽略。

您是否知道如何重构此代码以消除列表中无序的所有重复项?

4 个答案:

答案 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实施