如何解决在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。
-
每列等等...
任何帮助将不胜感激。
解决方法
如果我理解正确:
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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。