【问题标题】:Sorting rows of a 2d integer array from smallest to biggest将二维整数数组的行从小到大排序
【发布时间】:2015-01-30 15:24:50
【问题描述】:

我有一个名为 arry 的二维整数数组,如下所示:

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

我想按照结果的方式对其进行排序(为此我创建了相同大小的新数组,命名为表):

[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

【问题讨论】:

标签: java arrays sorting multidimensional-array


【解决方案1】:

真正的问题是这一行:

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】:
    arry[indexSmallest][0] = 2147483647;
    

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

    【讨论】:

      【解决方案3】:

      请记住,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() 方法中的比较逻辑。无论实现细节如何,这都是您的基本排序逻辑。

      【讨论】:

        【解决方案4】:

        你已经在一个对象中创建了这个信息并实现了 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...
            }
        
        }
        

        在主函数中: 你的对象 [] arr = 新的你的对象 [3]; arr[0] = new YourObject (.., .., ..,); arr[1] = new YourObject (.., .., ..,); arr[2] = new YourObject (.., .., ..,);

        Arrays.sort(arr); //对数据进行排序

        【讨论】:

          【解决方案5】:

          你可以使用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]
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-08
            • 2020-06-20
            • 2021-12-04
            • 2021-08-12
            • 2016-12-28
            • 2021-02-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多