簡體   English   中英

Java 中的列表排序問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM