簡體   English   中英

如何按列值對 2D ArrayList 進行排序,如果值相等怎么辦?

[英]How to sort a 2D ArrayList by column value, and what if the values are equal?

我想通過它們的特定列值對二維ArrayList進行排序,如果兩個 arrays 的列值相等,則使用另一個列值比較兩個 arrays。

例如:

array = [[2, 3, 4, 5][0, 2, 3, 4][0, 1, 2, 3][1, 2, 3, 4]]

我想先將它們與它們的索引[0]進行比較,但由於array[1][0]array[2][0]具有相同的值0我想通過它們的索引[3]來比較這兩個 arrays 。

因此,新數組將是:

[[0, 1, 2, 3][0, 2, 3, 4][1, 2, 3, 4][2, 3, 4, 5]]

我有這個代碼

public ArrayList<List<Integer>> sortArray(ArrayList<List<Integer>> spaces) {
    final Comparator<List<Integer>> comparator = new Comparator<List<Integer>>() {
        @Override
        public int compare(List<Integer> sList1, List<Integer> sList2) {
            return sList1.get(0).compareTo(sList2.get(0));
        }
    };

    Collections.sort(spaces, comparator);

    return spaces;
}

但是,這僅通過索引[0]比較值,並且當值相等時沒有條件。

我想你可以使用 Java Collections.List 的 compareTo 方法(我們簡稱 CT)。 以下是 CT 的一些示例輸出。 5.CT(7)->-1; 7.CT(5) -> 1; 5.CT(5)->0; 當它們相同時 compareTo 返回 0,所以你根本不交換它們的位置。 我不確定我是否正確回答了這個問題。

您需要比較子列表中的所有項目。 例如:

public int compare(List<Integer> sList1, List<Integer> sList2) {
    for (int i = 0; i < 4; i++) {
        int c = sList1.get(i).compareTo(sList2.get(i));
        if (c != 0)
            return c;
    }
    return 0;
}

如果您正在尋找快速算法,則不建議使用。

您需要修改Comparator以處理該索引檢查,如下所示:

public int compare(List<Integer> sList1, List<Integer> sList2) {
    if (sList1.get(0) != sList2.get(0)) {
        return sList1.get(0).compareTo(sList2.get(0));
    } else {
        return sList1.get(3).compareTo(sList2.get(3));
    }
}

但是,如果您正在運行 Java 8 及更高版本,您可以直接執行以下操作來對您的集合進行排序:

Collections.sort(spaces, (sList1, sList2) -> {
    if (sList1.get(0) != sList2.get(0)) {
        return sList1.get(0).compareTo(sList2.get(0));
    } else {
        return sList1.get(3).compareTo(sList2.get(3));
    }
});

對於 Java 8 之前的版本,您可以執行類似於您已經在執行的操作:

Collections.sort(spaces, new Comparator<List<Integer>>() {
    @Override
    public int compare(List<Integer> sList1, List<Integer> sList2) {
        if (sList1.get(0) != sList2.get(0)) {
            return sList1.get(0).compareTo(sList2.get(0));
        } else {
            return sList1.get(3).compareTo(sList2.get(3));
        }
    }
});

在這兩種情況下,output 將是:

[[0, 1, 2, 3], [0, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4, 5]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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