在2D整数数组中将元素从最小到最大排序

时间:2015-01-30 15:24:51

标签: java arrays sorting

我有像这样名为arry的2D整数数组:

[[6, 2, 7], [3, 6, 7], [5, 6, 1], [5, 3, 4], [5, 3, 8]]

我想按照结果的方式对它进行排序(为了做到这一点,我创建了相同大小的新数组,名为table):

[3, 6, 7]
[5, 6, 1]
[5, 3, 4]
[5, 3, 8]
[6, 2, 7]

我有这段代码:

for (int k = 0; k < numOfArrays; k++) {
    int smallest = 2147483647;
    int indexSmallest = 0;
        for (int h = 0; h < numOfArrays; h++) {
            if (arry[h][0] < smallest) {
                smallest = arry[h][0];
                indexSmallest = h;
            }
        }
        tabel[k] = arry[indexSmallest];
        arry[indexSmallest][0] = 2147483647;    
    }

for (int k = 0; k < numOfArrays; k++) {
    System.out.println(Arrays.toString(tabel[k]));
}

结果是:

[2147483647, 6, 7]
[2147483647, 6, 1]
[2147483647, 3, 4]
[2147483647, 3, 8]
[2147483647, 2, 7]

我不明白表格如何包含2147483647,如果我从未将表格的任何值设置为2147483647?

5 个答案:

答案 0 :(得分:2)

arry[indexSmallest][0] = 2147483647;

这行代码将每行中的第一个元素设置为最外层for循环末尾的2147483647。这就是它出现在每一行的原因。我不确定你打算在这里做什么,但这就是你获得这个价值的原因。

答案 1 :(得分:2)

真正的问题是这一行:

tabel[k] = arry[indexSmallest];

请记住,数组是对象。此行不复制内部数组,它设置对它的引用。

所以此时tabel[k]arry[indexSmallest]都指向同一个数组对象。所以当你这样做时:

arry[indexSmallest][0] = 2147483647;

您为arry[indexSmallest]tabel[k]更改了它(因为它们指向同一个对象)

要解决此问题,请致电tabel[k]数组的副本

tabel[k] = Arrays.copyOf(arry[indexSmallest], 3);

答案 2 :(得分:1)

请记住,Java数组是对象,这意味着它们是通过引用传递的。所以你实际上没有制作内部数组的副本;请使用Arrays.copyOf()

如果您允许Arrays.sort()使用Comparator,则可以这样做。

java.util.Arrays.sort(arry, new java.util.Comparator<int[]>() {
    public int compare(int[] a1, int[] a2) {
        for (int k = 0; k < a1.length; k++) {
            if (a1[k] != a2[k]) {
                return a1[k] - a2[k];
            }
        }
        return 0;
    }
});
for (int k = 0; k < numOfArrays; k++) {
    System.out.println(java.util.Arrays.toString(arry[k]));
}

如果不允许,那么您仍然可以使用上述Comparator.compare()方法中的比较逻辑。无论实现细节如何,这都是您的基本排序逻辑。

答案 3 :(得分:0)

您已在Object中创建此信息并实现Comparable / Comparator:

public YourObject implements Comparable {
    private long a;
    private long b;
    private long c;

    public YourObject (long a, long b, long c){
         this.a = a;
         this.b = b;
         this.c = c;
    }

    public int compareTo(Object arg0) {
        //make your comparison here...
    }

}

主要功能: YourObject [] arr = new YourObject [3]; arr [0] = new YourObject(..,..,..,); arr [1] = new YourObject(..,..,..,); arr [2] = new YourObject(..,..,..,);

Arrays.sort(ARR); //排序数据

答案 4 :(得分:0)

您可以通过使用 Arrays.sort 方法大大简化您的代码,或者您可以实现类似的东西。


按列选择二维数组的排序

public static void selectionSort2D(int[][] arr, int column) {
    // iterate over all subsets of the rows of the array
    // (0-last, 1-last, 2-last, 3-last, ...)
    for (int i = 0; i < arr.length; i++) {
        // assume the min is the first row element
        int min = arr[i][column];
        // row index of the min element
        int min_i = i;
        // check the rows after i to find the smallest
        for (int j = i + 1; j < arr.length; j++) {
            // if this row element is less,
            // then it is the new min
            if (arr[j][column] < min) {
                min = arr[j][column];
                min_i = j;
            }
        }
        // if the min element row is not equal to
        // the current one, then swap these rows
        if (i != min_i) {
            int[] temp = arr[i];
            arr[i] = arr[min_i];
            arr[min_i] = temp;
        }
    }
}
// test
public static void main(String[] args) {
    int[][] arr = {
            {6, 2, 7},
            {3, 6, 7},
            {5, 6, 1},
            {5, 3, 4},
            {5, 3, 8}};

    // sort by first column
    selectionSort2D(arr, 0);

    // output
    for (int[] row : arr)
        System.out.println(Arrays.toString(row));
    //[3, 6, 7]
    //[5, 6, 1]
    //[5, 3, 4]
    //[5, 3, 8]
    //[6, 2, 7]
}