[英]Sorting a double array
這是我未排序的數組:
P B A
5 125 400
2 102 145
3 56 200
6 65 200
7 30 200
4 148 300
1 135 0
這是我對當前數組進行排序后的結果,這是我得到的輸出
P B A
1 135 0
2 102 145
3 56 200
6 65 200
7 30 200
4 148 300
5 125 400
我希望輸出看起來像這樣
P B A
1 135 0
2 102 145
7 30 200
3 56 200
6 65 200
4 148 300
5 125 400
目前這是我的代碼
Arrays.sort(myArr, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[2], o2[2]);
}
});
您需要進一步指定Comparator
。 目前,您僅按第3個元素對數組進行排序。
Arrays.sort(myArr, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
int ret = Integer.compare(o1[2], o2[2]);
// if the entries are equal at index 2, compare index 1
if (0 == ret) {
ret = Integer.compareTo(o1[1], o2[1]);
}
return (ret);
}
});
首先,將int
數組存儲在另一個數組中,大概是在int[][]
。 您試圖在內部數組的3個元素之間建立關系。 在像Java這樣的面向對象的語言中,最好定義一個類來將3個值存儲在一起,然后創建一個一維數組來存儲對象。
public class My3Values {
private int p, b, a;
// Constructor(s), getters go here
}
(它不必稱為My3Values
,僅作為示例。)
然后,您可以將Comparator
類定義為Comparator<My3Values>
。
其次,您當前正在忽略B
值,這意味着您需要進行排序。 如果A
值相同,則添加考慮B
值的代碼。
int comp = Integer.compare(o1.getA(), o2.getA());
if (comp == 0)
{
comp = Integer.compare(o1.getB(), o2.getB());
}
return comp;
您需要處理以下情況:比較第二行將返回0
(等於值),在這種情況下,將返回比較第一列中的值的結果。
因此,您的代碼可以執行以下操作:
Arrays.sort(myArr, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
int result = Integer.compare(o1[2], o2[2]);
if (result != 0)
return result;
else
return Integer.compare(o1[1], o2[1]);
}
});
但是,如果您可能想要比較多個列,並且想要輕松創建不同的訂單,則應該為每一列創建單獨的比較器。
在Java 8中,您可以重寫比較器,例如
Comparator<int[]> secondColumnt = new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[2], o2[2]);
}
}
通過寫成
Comparator<int[]> secondColumnt = Comparator.comparingInt(row -> row[2]);
因此,我們還要為第一列創建比較器
Comparator<int[]> firstColumnt = Comparator.comparingInt(row -> row[1]);
現在,從Java 8開始,我們可以使用thenComparing
方法從已經存在的比較器中創建比較器。
因此,如果我們要創建比較器,它將首先比較第二列中的值,並且如果它們與第一列中的值相等,則可以將其寫為
Comparator<int[]> secondThenFirstColumn = secondColumnt.thenComparing(firstColumnt);
所以你的最終代碼看起來像
Arrays.sort(myArr, secondThenFirstColumn);
要么
Arrays.sort(myArr, secondColumnt.thenComparing(firstColumnt));
或者如果您不想創建單獨的預定義比較器
Arrays.sort(myArr, Comparator.<int[]>comparingInt(row -> row[2]).thenComparingInt(row -> row[2]));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.