对双数组进行排序

时间:2015-04-13 16:38:09

标签: java arrays sorting comparator

这是我未分类的数组:

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

3 个答案:

答案 0 :(得分: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);
    }
});

答案 1 :(得分:1)

首先,您将int数组存储在另一个数组中,可能是int[][]。您试图强制内部数组的3个元素之间的关系。在像Java这样的面向对象语言中,最好定义一个类来将3个值存储在一起,然后创建一个存储对象的一维数组。

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

(它不必被称为My3Values,仅举例来说。)

然后,您可以将Comparator课程定义为Comparator<My3Values>

其次,您当前忽略的B值意味着您的排序。如果B值相同,请添加考虑A值的代码。

int comp = Integer.compare(o1.getA(), o2.getA());
if (comp == 0)
{
    comp = Integer.compare(o1.getB(), o2.getB());
}
return comp;

答案 2 :(得分:1)

您需要处理比较第二行将返回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]));