java - 比较方法在某些 Android 设备上违反了其一般合同
问题描述
我的长比较器有问题,时间字段是一个 unix 时间戳,由于某种原因,在几个 android 设备上我得到以下异常:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:899)
at java.util.TimSort.mergeAt(TimSort.java:516)
at java.util.TimSort.mergeForceCollapse(TimSort.java:457)
at java.util.TimSort.sort(TimSort.java:254)
at java.util.Arrays.sort(Arrays.java:1492)
at java.util.ArrayList.sort(ArrayList.java:1470)
at java.util.Collections.sort(Collections.java:206)
编码:
public class SortByTime implements Comparator<JniChatItem> {
@Override
public int compare(JniChatItem item, JniChatItem item2) {
return (int) (item.time - item2.time);
}
}
public ArrayList<JniChatItem> getLastItemsOfChatsN(int itemCount) {
ArrayList<JniChatItem> chatItemsList = new ArrayList<>();
if (JniChatManager.getChatState() == ChatState.NEW_CHAT) {
List<String> chatIds = getAllChatIds();
chatItemsList.addAll(getLastItemsByChatsIds(chatIds, 1));
Collections.sort(chatItemsList, new SortByTime());
if (chatItemsList.size() > itemCount) {
chatItemsList.subList(0, itemCount - 1);
}
}
return chatItemsList;
}
更新:我刚刚意识到,也许是因为它们是两个长值,它们可能无法正确转换为 int,所以它们可能太长了。我将切换到 Long.comapare 并检查异常是否消失
解决方案
推荐阅读
- vue.js - Vue.js:绑定选择框,但不想 ajax 所有选项
- node.js - 如何从“分析”区域获取数据?
- angular - 在 Angular 中放置独立函数的位置
- reactjs - 如何从 Intellij 运行/执行/调试 react/redux 应用程序
- git - Intellij Github Integration 给了我一个不同的帐户
- php - Laravel 6 - MariaDB 10.1:Illuminate\Database\QueryException:SQLSTATE[HY000] 迁移错误
- python - matplotlib 阻止我的其余代码运行
- python-3.x - Errno 2 没有这样的文件或目录:'credentials.json'
- java - 如何将复杂的 YAML 解析为 Java 对象层次结构(Spring Boot 配置)
- python - 如何为没有字段的模型制作 Django 夹具?