java - Java Collections.sort() 比较器
问题描述
我正在对我的自定义对象进行排序。自定义对象包含状态和时间戳。首先,我必须对状态进行排序,然后是时间戳。具有以下值的状态
运行、等待、注册、完成和中止
因此,具有价值 Running 的状态应该排在首位,然后是 Waiting 等等。
如果我必须按字母顺序排序,那么我可以通过
state1.compareTo(state2)
但是我可以用这个标准排序吗?请帮我写这个逻辑。
编辑
正如你们建议的那样,我采用了 Enum
private enum TournamentState {
Running,
Waiting,
Registering,
Completed,
Aborted
}
并像下面这样比较
int sort = EnumState.valueOf(status1).compareTo(EnumState.valueOf(status2));
if(sort != 0){
return sort;
}else{
return (int) (time1 - time2);
}
非常感谢您的支持。
解决方案
您可以使用比较器功能的组合:
Comparator<MyClass> comparator = Comparator.comparing(MyClass::getState)
.thenComparing(MyClass::getTimeStamp);
最后一行可能需要相应更改,具体取决于数据类型:
.thenComparingLong(MyClass::getTimeStamp); //if it's a long TS
甚至
.thenComparing((ts1, ts2) -> {
//custom comparison logic for time stamp values
return result;
});
Comparator.thenComparing
与此评论一起记录:
返回具有另一个比较器的字典顺序比较器。如果此 Comparator 认为两个元素相等,即 compare(a, b) == 0,则使用 other 来确定顺序。
请注意,MyClass.state
在这种情况下假定它是可比较的,例如作为一个枚举,它本质上是可比较的。如果它是纯字符串,那么您可能也需要自定义逻辑,例如:
final String order = "Running, Waiting, Registering, Completed and Aborted";
Comparator<MyClass> comparator =
Comparator.comparingInt(e -> order.indexOf(e.getState()))
.thenComparing(MyClass::getTimeStamp);
推荐阅读
- clojure - 我可以从 uberjar 启动 Gorilla REPL 吗?
- swift - 如果这个类是通用的,如何检查一个对象是否是给定类的实例?
- python - 如何使用 to_clipboard() 提供 DataFrame 的可复制副本
- javascript - Chai 期望列表包含字符串类型的项目
- python - 使用 boto3 更新 route53 记录集的问题
- javascript - 防止点击事件在自定义事件后触发
- java - 无法序列化 ArrayList
与Gson JAVA | 安卓 - r - R按两组对变量求和
- tfs - 如何使用 TFS 2018 实时查看使用测试代理运行的测试用例结果?
- ats - 堆叠点表示法需要哪些类型?