隊(duì)列排序常見(jiàn)的問(wèn)題總結(jié)
- Long類(lèi)型強(qiáng)制轉(zhuǎn)換問(wèn)題
var addToQueueTime: Long
fun compareTo(entity2: IBroadCastEntity): Int {
return (entity2.addToQueueTime - addToQueueTime).toInt()
}
該情況下long類(lèi)型強(qiáng)制轉(zhuǎn)換為int類(lèi)型,存在數(shù)據(jù)溢出隱患,本來(lái) entity2.addToQueueTime - addToQueueTime > 0的,結(jié)果數(shù)據(jù) 溢出后可能為 負(fù)值,從而產(chǎn)生相反的排序結(jié)果
- 漏掉==的情況
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
}
}
}
該情況下,漏掉了相等的情況,會(huì)引發(fā)相應(yīng)的報(bào)錯(cuò)
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中對(duì)比的3原則
自反性:當(dāng) 兩個(gè)相同的元素相比時(shí),compare必須返回0,也就是compare(o1, o1) = 0;
反對(duì)稱(chēng)性:如果compare(o1,o2) = 1,則compare(o2, o1)必須返回符號(hào)相反的值也就是 -1;
傳遞性:如果 a>b, b>c, 則 a必然大于c。也就是compare(a,b)>0, compare(b,c)>0, 則compare(a,c)>0
上面這個(gè)用列就是違反自反性原則,導(dǎo)致的報(bào)錯(cuò)
總結(jié)下升序和降序的總結(jié)
class MyComparator implements Comparator<A> {
@Override
public int compare(A o1, A o2) {
//升序
//return o1.a - o2.a;
//降序:后面會(huì)具體分析為什么降序
return o2.a - o1.a;
}
}