首页 > 解决方案 > 比较方法在某些 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 并检查异常是否消失

标签: javaandroid

解决方案


推荐阅读