java - 如何在 TreeSet 中切换排序顺序
问题描述
我有一个自定义类,我已经实现了两个Comparable
接口Comparator
。两者的排序/比较逻辑相反。
以下面的类为例:
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
到 a时,它会按照 JDK 源代码的实现进行排序。那么是否有任何标志/开关可以切换到实现所代表的排序?我不想将另一个传递给构造函数。TreeSet
Comparable
Comparable
Comparator
TreeSet
解决方案
你有一个误解:
- 一个
Comparable
类具有可以相互比较的对象(例如,通过一个想要对它们进行排序的容器 - A
Comparator
是比较某个类的两个对象的东西。
你不需要让你的类同时实现。
更糟糕的是:请记住代码传达意图:您的类实现两个接口的想法,但是以“相反”的方式,这非常违反直觉。它只会让您的读者感到困惑,并可能导致各种错误,因为您的代码做了一些经验丰富的 Java 开发人员会期望它做的事情。永远不要编写让读者感到惊讶的代码(以一种糟糕的方式)。
请注意,您可以简单地使用Collections.reverseOrder()
例如创建一个 TreeSet!换句话说:您定义了如何比较两个对象的事实Test
允许您已经使用默认(反向)比较器。
长话短说:避免“发明”“聪明”的技巧来解决框架行为。相反,学习框架如何“滴答作响”,并适应它。不与潮流搏斗,随波逐流。
推荐阅读
- json - 如何在 Google Data Studio 中设置地图默认缩放和位置?
- ubuntu-16.04 - CVAT COCO json文件分割空
- netcdf - 将 grib 文件转换为 netcdf(jpeg 格式)
- python - Python,从 selenium 中的 anticaptcha 提交 reCaptcha 令牌
- flutter - 无法在运行时创建新的项目对象
- testing - 环回运行状况真正检查的是什么?
- java - 如何为多个 Jbutton 编写动作监听器
- python - 使用字符串作为字节
- amazon-web-services - Snowflake 无法在没有访问密钥的情况下从 S3 下载文件,而 s3fs 能够从 S3 下载该文件
- amazon-web-services - 如何将全局变量放入 AWS sam 项目中