对双数组进行排序

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这样的面向对象的语言中,最好定义一个class将3个值存储在一起,然后创建一个一维数组来存储对象。

public class My3Values {
    private int p, b, a;
    // Constructor(s), getters go here
}

(不一定要叫My3Values,只是举例。)

然后您可以将 Comparator class 定义为 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;

您需要处理比较第二行的情况 return 0 (相等的值),在这种情况下 return 比较第一列的值的结果。

因此您的代码可能会执行如下操作:

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]));