java - Java Collections.Sort 比较方法违反了它的一般约定
问题描述
从昨天开始,我的代码出现错误,我不知道为什么!我用谷歌搜索了很多,发现了这个Stack-Post。
我使用此功能按名称对用户进行排序并创建日期。这个功能已经工作了 2 年,现在我收到一个用户的错误,我不知道发生了什么变化。我试图检查我的数据是否有任何损坏但找不到任何问题。
在阅读了 zh Stack-Post 之后,我仍然没有完全理解我的项目有什么问题或发生了什么变化。
public void sortUsers(List<Users> sortList) {
Collections.sort(sortList, new Comparator<Users>() {
public int compare(Users user1, Users user2) {
Integer comp = 0;
comp = user1.getUsername().compareTo(user2.getUsername());
if (comp == 0) {
comp = user1.getCreateDate().before(user2.getCreateDate()) ? -1 : 1;
}
return comp;
}
});
}
解决方案
comp = user1.getCreateDate().before(user2.getCreateDate()) ? -1 : 1;
在日期相等的情况下,此行永远不会返回零。这意味着它不是反对称的(即sgn(a.compareTo(b)) = -sgn(b.compareTo(a))
)。
确切的修复取决于getCreateDate()
返回的类,但它可能类似于:
comp = user1.getCreateDate().compareTo(user2.getCreateDate());
但是,构建兼容比较器的更简单方法是:
Comparator.comparing(Users::getUsername).thenComparing(Users::getCreateDate)
或类似的。
推荐阅读
- php - 在 MacOS Mojave 10.14.3 上安装 pear
- php - 保持下拉菜单被选中 laravelcollective/html
- php - 如何在没有 Mysql 的情况下使用 php 获取选定的整行数据
- maven - 带有 Spring Boot 的多模块 Web 应用程序 Maven 架构
- macos - 一个串口在 macOS 上使用 tarm/serial 接收 golang 中的数据问题
- angular - 绑定 ngModel 角度对话框关闭
- javascript - 在 Scroll 上滑动 div
- java - 当会话缓存大对象时,休眠事务提交非常慢
- ios - iOS:嵌入式导航控制器使用其他导航栏
- python - 如何在单击 QTreeWidget 的空白区域时执行功能