我有一个自定义类,其中实现了 Comparable
和 Comparator
接口(interface)。两者的排序/比较逻辑相反。
以下面的类为例:
class Test implements Comparable<Test>, Comparator<Test>{
private Integer field;
public Test(Integer field){this.field = field;}
@Override
public int compareTo(Test obj){
return this.field.compareTo(obj.field);
}
@Override
public int compare(Test t1, Test t2){
return -t1.compareTo(t2);
}
//impl of equals, hashCode and toString omitted for this example
}
因此,当我默认将 Test
对象添加到 TreeSet
时,它是按 Comparable
的实现进行排序的,其理解为JDK 源。那么是否有任何标志/开关可以切换到由 Comparable 实现表示的排序?
我不想将另一个 Comparator
传递给 TreeSet
构造函数。
最佳答案
您这边有一个误解:
Comparable
类具有可以相互比较的对象(例如通过想要对它们进行排序的容器Comparator
是比较某个类的两个对象的东西。
您无需让您的类实现两者。
更糟糕的是:请记住,代码传达意图:您的类实现两个接口(interface)的想法,但以“相反”的方式,这是非常违反直觉的。它只会让你的读者感到困惑,并可能导致各种错误,因为你的代码做了一些经验丰富的 Java 开发人员很少会期望它做的事情。永远不要编写让读者感到惊讶的代码(以一种糟糕的方式)。
相反,请注意,您可以简单地使用 Collections.reverseOrder()
创建一个 TreeSet!换句话说:您定义了如何比较 Test
的两个对象这一事实允许您使用默认的 (reversing)已经有了比较器。
长话短说:避免“发明”“聪明”的技巧来解决框架行为。相反,了解框架如何“运行”并适应它。不要与潮流抗争,要随波逐流。
关于java - 如何切换TreeSet中的排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54827626/