基于列对2D整数数组进行排序

时间:2011-10-29 05:13:02

标签: java arrays sorting

我有一个2D数组,我想根据第二列进行排序。第一列应保持与第二列配对。

2D阵列最初如下(2x10矩阵):

0 10
1 9
2 9
3 9
4 15
5 10
6 4
7 8
8 11
9 12

我希望上面的2D数组按如下方式排序:

4 15
9 12
8 11
0 10
5 10
1 9
2 9
3 9
7 8
6 4

现在,我尝试将Sort a two dimensional array based on one column的答案改编为以下代码:

Arrays.sort(theArray, new Comparator<Integer[]>()
{
    @Override
    public int compare(Integer[] int1, Integer[] int2)
    {
        Integer numOfKeys1 = int1[1];
        Integer numOfKeys2 = int2[1];
        return numOfKeys1.compareTo(numOfKeys2);
    }
});

但是,它似乎根本不对数组进行排序。在调用sort()函数后打印数组时,数组是初始顺序。

我也尝试从这里调整答案:sorting 2D array of String in java但我遇到了同样的问题。

在调整这些解决方案时,我是否犯了一些致命的错误,或者我的代码是否有效?

另外,我将如何按降序排序此数组?我会将compare()中的return语句替换为这一行吗?

return -numOfKeys2.compareTo(numOfKeys1);

非常感谢任何帮助。谢谢!

编辑:只需发布我的其余代码,看看问题是否在其他地方。

public void Sort()
{   
    Integer[][] theArray = {{0,10},{1,9},{2,9},{3,9},{4,15},{5,10},{6,4},{7,8},{8,11},{9,12}};;

    dump(theArray);
    Arrays.sort(theArray, new Comparator<Integer[]>()
    {
        @Override
        public int compare(Integer[] int1, Integer[] int2)
        {
            Integer numOfKeys1 = int1[1];
            Integer numOfKeys2 = int2[1];
            return numOfKeys1.compareTo(numOfKeys2);
        }
    });

    System.out.println("====");
    dump(theArray);     
}

public void dump(Integer[][] array)
{
    for(int p = 0, q = 10; p < q; p++)
    {
        System.out.println(array[p][0] + " " + array[p][1]);
    }
}

编辑2:

我已经开始工作了。谢谢大家的帮助。我有多个Sort()函数(一个不起作用的旧函数,以及你在上面看到的函数),但事实证明我调用了错误函数,即使我认为我改变了调用。只是其中一天。

如果要对数组进行排序,请随意使用上面的代码。它现在完全正常工作。

4 个答案:

答案 0 :(得分:1)

对我来说很好。要颠倒顺序,您可以否定原始compareTo交换变量,但不能同时交换。

我们可能需要查看剩下的代码才能理解为什么你会看到你所看到的内容;我逐字地剪切并粘贴了你的代码,所以问题很好,问题出在其他地方。


dump(theArray);
Arrays.sort(theArray, new Comparator<Integer[]>() {
    public int compare(Integer[] int1, Integer[] int2) {
        Integer numOfKeys1 = int1[1];
        Integer numOfKeys2 = int2[1];
        return numOfKeys1.compareTo(numOfKeys2);
    }
});
System.out.println("================");
dump(theArray);


0 10 
0 10 
1 9 
2 9 
3 9 
4 15 
5 10 
6 4 
7 8 
8 11 
9 12 
================
6 4 
7 8 
1 9 
2 9 
3 9 
0 10 
0 10 
5 10 
8 11 
9 12 
4 15 

答案 1 :(得分:1)

代码也适用于我。对不起凌乱的代码,我不得不做一个快速测试。此致!

import java.util.*;

class arraysort {

    public static Integer[][] mysort(Integer[][] ar) {
        Arrays.sort(ar, new Comparator<Integer[]>() {
            @Override
            public int compare(Integer[] int1, Integer[] int2) {
                Integer numOfKeys1 = int1[1];
                Integer numOfKeys2 = int2[1];
                return numOfKeys1.compareTo(numOfKeys2);
            }
        });
        return ar;
    }

    public static void main(String[] s) {
        Integer[][] myarr = {{0, 10}, {1, 9}, {2, 9}, {3, 9}, {4, 15}, {5, 10}, {6, 4}};

        for (Integer[] i : myarr) {
            System.out.println(i[0] + "," + i[1]);
        }

        myarr = mysort(myarr);

        for (Integer[] i : myarr) {
            System.out.println(i[0] + "," + i[1]);
        }
    }
}

答案 2 :(得分:0)

我也完全运行了你的代码并且它有效...但有一件事我必须更换

System.out.println(array[0][p] + " " + array[1][p]);

System.out.println(array[p][0] + " " + array[p][1]);

运行代码,否则它会给出数组索引超出范围的异常。

否定compareTo返回比交换值更容易,并且允许轻松更改。

答案 3 :(得分:0)

现在您可以像下面那样轻松地做到这一点。这将根据第 2 列按降序对数组进行排序。

Arrays.sort(theArray, (a, b) -> b[1] - a[1]);