队列排序常见的问题总结
- Long类型强制转换问题
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;
}
}