【问题标题】:Sorting 2D array of integers by column按列对二维整数数组进行排序
【发布时间】:2021-02-03 17:44:55
【问题描述】:

我需要在 Java 中构建一个方法,其中输入是一个 2D 整数数组,结果是一个 2D 整数数组,其中每个元素都引用一个元素在列中的位置。让我用一个例子来解释一下。将 5x5 的 2D 数组作为该方法的输入,如下所示:

int[][] array = new int[][]{
        {124, 188, 24, 254, 339},
        {0, 7, 77, 145, 159},
        {206, 340, 280, 523, 433},
        {310, 265, 151, 411, 398},
        {24, 104, 0, 183, 198}};

现在我需要建立一个新的二维整数数组(我将在下面调用newArray)根据:

  • 数组中第 0 列的最小值为 0,并且与第 1 行相关联(那么,我需要在 newArray[0][0] 中分配一个 1)。

  • 接下来,数组中第 0 列的最小值为 24,并与第 4 行相关联(然后,我需要在 newArray[1][0] 中分配一个 4)。

  • 那么,数组中第0列的最小值为124,并与第0行相关联(那么,我需要在newArray[2][0]中分配一个0)。

  • 每列以此类推...

该方法的最终输出必须类似于下面的二维数组。

任何帮助将不胜感激。

【问题讨论】:

    标签: java arrays multidimensional-array columnsorting


    【解决方案1】:

    如果我理解正确:

    IN :
         {{124, 188, 24,  254, 339},
          {0,   7,   77,  145, 159},
          {206, 340, 280, 523, 433},
          {310, 265, 151, 411, 398},
          {24,  104, 0,   183, 198}}
    
    OUT :
         {{1, 1, 4, 1, 1}
          {4, 4, 0, 4, 4}
          {0, 0, 1, 0, 0}
          {2, 3, 3, 3, 3}
          {3, 2, 2, 2, 2}
    

    代码如下:

    public static int[][] createArray(int[][] a) {
        int[][] nA = new int[a.length][a[0].length];
        int[] col = new int[a.length];
        int minIndex = -1;
        for (int i = 0; i < a.length; i++) {
            // First get the col out
            for (int j = 0; j < a[0].length; j++) {
                col[j] = a[j][i];
            }
            // Loop through the col
            for (int k = 0; k < a[0].length; k++) {
                int min = Integer.MAX_VALUE;
                // Loop through the remaining numbers of the col
                for (int j = 0; j < col.length; j++) {
                    // Find the remaining lowest number
                    if (min > col[j]) {
                        min = col[j];
                        minIndex = j;
                    }
                }
                // Delete the number from the array
                col[minIndex] = Integer.MAX_VALUE;
                // Set this number in the final array
                nA[k][i] = minIndex;
            }
        }
        return nA;
    }
    

    可能有更简单的方法,但它有效!

    【讨论】:

      【解决方案2】:

      按列对矩阵元素的索引进行排序就是按转置矩阵的行对元素的索引进行排序:

      int m = 5;
      int n = 6;
      int[][] arr1 = new int[][]{
              {124, 188, 24, 254, 339, 3},
              {0, 7, 77, 145, 159, 1},
              {206, 340, 280, 523, 433, 5},
              {310, 265, 151, 411, 398, 4},
              {24, 104, 0, 183, 198, 2}};
      
      int[][] arr2 = IntStream
              // iterate over the indices
              // of the rows of the array
              .range(0, n)
              .mapToObj(i -> IntStream
                      // iterate over the
                      // indices of the columns
                      .range(0, m)
                      .boxed()
                      // sort indices of the elements of the
                      // columns by its values in the array
                      .sorted(Comparator.comparingInt(j -> arr1[j][i]))
                      .mapToInt(Integer::intValue)
                      // sorted column of indices is
                      // a row in the new array
                      .toArray())
              // return sorted array of indices
              .toArray(int[][]::new);
      
      // transpose the array of indices
      int[][] arr3 = new int[m][n];
      IntStream.range(0, m).forEach(i ->
              IntStream.range(0, n).forEach(j ->
                      arr3[i][j] = arr2[j][i]));
      
      // output
      Arrays.stream(arr3).map(Arrays::toString).forEach(System.out::println);
      

      输出:

      [1, 1, 4, 1, 1, 1]
      [4, 4, 0, 4, 4, 4]
      [0, 0, 1, 0, 0, 0]
      [2, 3, 3, 3, 3, 3]
      [3, 2, 2, 2, 2, 2]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-26
        • 2013-08-17
        • 2021-05-23
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        相关资源
        最近更新 更多