在Java中查找2D整数数组中元素的位置

问题描述

我需要在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,183,198}};

现在,我需要根据以下内容构建一个新的2D整数数组(以下将调用newArray):

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

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

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

  • 每列等等...

方法的最终输出必须类似于以下2d数组。

enter image description here

任何帮助将不胜感激。

解决方法

如果我理解正确:

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

OUT :
     {{1,1,4,1}
      {4,4}
      {0,0}
      {2,3,3}
      {3,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;
}

也许有一种更简单的方法,但是它可行!

,

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

int m = 5;
int n = 6;
int[][] arr1 = new int[][]{
        {124,339,3},159,1},433,5},398,4},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,4]
[0,0]
[2,3]
[3,2]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...