java - 如何切换TreeSet中的排序顺序

标签 java

我有一个自定义类,其中实现了 ComparableComparator 接口(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/

相关文章:

java - 如何使用 session 外观从远程客户端访问实体 bean

java - 无法处理配置类的导入候选

java - 减去和比较日期

java - 如何解决elasticsearch中的AccessDeniedException?

java - Apache Commons CLI 中的 DefaultParser

java - 在 Multi-Tenancy 架构中为每个租户在单独的文件中记录异常

java - GWT ListBox 默认未选中

java - 如何将ArrayList打印成行和列?

java - android中如何获取某个前缀后的值?

Java 集成测试无可运行方法错误 - Spring Runner