[英]List within list Sorting issue in Java
我正在嘗試對List<List<Integer>>
進行排序。 內部列表將有 3 個值。 (X 坐標、Y 坐標、開始/結束)現在雖然它適用於大多數情況,但對於特定情況,排序會失敗。
我用於排序的代碼是:
arr.sort((a,b) -> {
if(a.get(0)!=b.get(0)){
return a.get(0) - b.get(0);
}
else{
return (a.get(2)==0?-a.get(1):a.get(1)) - (b.get(2)==0?-b.get(1):b.get(1));
}
});
其背后的邏輯是:如果 x 值不相等,我們將根據 x 對它們進行排序。 如果相等,則:如果兩者都以降序開始,則基於高度。 如果兩者都以升序結束,則以高度為基礎。 否則以開始為准。
開始顯示為 0,結束顯示為 1。
失敗的例子是:arr:
[[1, 10000, 0], [10001, 10000, 1], [2, 9999, 0], [10001, 9999, 1]]
Output:
[[1, 10000, 0], [2, 9999, 0], [10001, 10000, 1], [10001, 9999, 1]]
而預期的排序是:
[[1, 10000, 0], [2, 9999, 0], [10001, 9999, 1], [10001, 10000, 1]]
你能幫我找出我做錯了什么嗎?
代碼按預期工作。 由於在[10001, 9999, 1]
和[10001, 10000, 1]
之間進行比較的代碼中,它將在else
語句中為 go 並且因為a.get(2)
和b.get(2)
都不是零, else
語句將簡化為b.get(1) - a.get(1)
,按降序排列。 因此,它將按[10001, 10000, 1]
的順序排序,然后是[10001, 9999, 1]
。
此外,不應使用==
或!=
運算符比較盒裝整數 ( Integer
),因為它們將通過引用進行比較。 相反,應該使用equals
方法。
第二個 else 條件應該從 a 的 y 中減去 b 的 y。 像這樣的東西:
(a,b) -> {
if(!a.get(0).equals(b.get(0))){
return a.get(0) - b.get(0);
}
else{
return (a.get(2).equals(0)?-a.get(1):a.get(1)) - (b.get(2).equals(0)?-b.get(1):b.get(1));
}
}
我認為原始排序代碼很難閱讀並且不符合您的期望。 我將其更改為:
public static void main(String[] args) {
List<List<Integer>> list = Arrays.asList(Arrays.asList(1, 10000, 0),
Arrays.asList(10001, 10000, 1), Arrays.asList(2, 9999, 0)
,Arrays.asList(10001, 9999, 1)
, Arrays.asList(10001, 9999, 0));
Collections.sort(list, (a,b) -> {
if(!a.get(0).equals(b.get(0))){
return a.get(0) - b.get(0);
}
else{
if (b.get(2).equals(a.get(2))) {
if (a.get(2) == 0) {
return Integer.compare(b.get(1), a.get(1)); //start, descending
} else {
return Integer.compare(a.get(1), b.get(1)); // ascending
}
} else {
return a.get(2) == 0 ? -1 : 1; // 0 first
}
}
});
System.out.println(list); // [[1, 10000, 0], [2, 9999, 0], [10001, 9999, 0], [10001, 9999, 1], [10001, 10000, 1]]
}
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.