java排序总结

2023-05-10  本文已影响0人  andy_db22

队列排序常见的问题总结

   var addToQueueTime: Long

   fun compareTo(entity2: IBroadCastEntity): Int {
       return (entity2.addToQueueTime - addToQueueTime).toInt()
   }

该情况下long类型强制转换为int类型,存在数据溢出隐患,本来 entity2.addToQueueTime - addToQueueTime > 0的,结果数据 溢出后可能为 负值,从而产生相反的排序结果

data class ImChatMsgItem(
    var userId: Long = 0,
    var avatar: String = "",
    var name: String = "",
    var lastMsg: String = "",
    var lastMsgTime: Long = 0,
) : Comparable<ImChatMsgItem> {
    override fun compareTo(other: MsgItem): Int {
        return if (other.lastMsgTime - lastMsgTime > 0) {
            1
        } else {
            -1
        }
    }
}

该情况下,漏掉了相等的情况,会引发相应的报错

java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:866)
    at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:483)
    at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:422)
    at java.util.ComparableTimSort.sort(ComparableTimSort.java:222)
    at java.util.Arrays.sort(Arrays.java:1302)
    at java.util.Arrays.sort(Arrays.java:1485)
    at java.util.ArrayList.sort(ArrayList.java:1470)
    at java.util.Collections.sort(Collections.java:206)
    at java.util.Collections.sort(Collections.java:159)
    at kotlin.collections.CollectionsKt__MutableCollectionsJVMKt.sort((MutableCollectionsJVM.kt:31) (#pluginId:host#)

到这里不得提下,java中对比的3原则

自反性:当 两个相同的元素相比时,compare必须返回0,也就是compare(o1, o1) = 0;

反对称性:如果compare(o1,o2) = 1,则compare(o2, o1)必须返回符号相反的值也就是 -1;

传递性:如果 a>b, b>c, 则 a必然大于c。也就是compare(a,b)>0, compare(b,c)>0, 则compare(a,c)>0

上面这个用列就是违反自反性原则,导致的报错

总结下升序和降序的总结

class MyComparator implements Comparator<A> {

    @Override
    public int compare(A o1, A o2) {
        //升序
        //return o1.a - o2.a;
        //降序:后面会具体分析为什么降序
        return o2.a - o1.a;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读