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