簡體   English   中英

排序雙精度數組

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

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