hlo 我一直很困惑,為什么我們要用(a,b) -> a-b來排序。
例子-
Collections.sort(list, (a, b) -> { return (a[1] - b[1]); });
PriorityQueue MaxHeap = new PriorityQueue<> ((a,b) -> a-b);
我真的很困惑,我試圖通過除錯代碼來理解這個陳述句的流程。
ArrayList<int[]> list = new ArrayList< > ();
for (int i = 0; i < n; i ) {
list.add(new int[] { start[i], end[i] }) 。
}
Collections.sort(list, (a, b) -> {
return(a[1] - b[1])。
});
int count = 1;
int[] x = list.get(0)。
for (int i = 1; i< list.size(); i ) {
int[] res = list.get(i);
if (x[1] < res[0] ) {
count = 1;
x = res;
}
}
return count。
}
如果有人有更好的方法來理解這一點,請幫助我。
uj5u.com熱心網友回復:
lambda的目標 (a,b) -> a-b是為了產生一個滿足Comparator契約的數字:
- 如果
a小于b- 回傳一個負的結果 。
- 如果
a等于b- 回傳零 。
- 如果
a大于b--回傳一個正的結果。
由Comparator回傳的值被sort用于比較集合中的成對元素(數字),以決定哪個更大。
問題是a - b對于Java整數型別1來說不能正常作業。 在某些情況下,a - b會溢位,你會得到一個符號錯誤的結果。 例如,如果a是Integer.MIN_VALUE而b是一個正整數,那么a - b將是正的,而它應該是負的。
(這是一個相當常見的錯誤,即使是相對有經驗的程式員也會犯......雖然希望只有一次。
相比之下,Integer.compare(int, int)方法給出了正確的答案...對于所有可能的引數。 所以更好的(也就是更正確的)解決方案是:
Collections.sort(list, (a, b) -> Integer.compare(a[1], b[1]) 。)
PriorityQueue<Integer> MaxHeap = new PriorityQueue<> (Integer::compare)。
1 - 事實上,對于任何種類的整數型別,溢位不會觸發某種例外。 而對于浮點型別,則有不同的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/306927.html
標籤:
