使用 for 循环反转二维数组
Reverse 2 dimensional array using for-loops
我自学 Java 大约 6 个月,所以我对编码还很陌生,我需要你的帮助。
我想使用 2 个循环完全反转二维数组 (a) 并将其写入另一个数组,但是当我尝试更改行和列值时出现 OutOfBondsError。我好像不太明白这些嵌套循环是如何工作的...
起始数组a:
1.) 1.0 2.0 3.0 2.0
2.) 0.0 1.0 2.0 0.0
3.) 0.0 0.0 1.0 3.0
我的代码应该像这样反转。
目标数组 t:
1.) 3.0 1.0 0.0 0.0
2.) 0.0 2.0 1.0 0.0
3.) 2.0 3.0 2.0 1.0
final double[][] a = new double[3][];
a[0] = new double[]{1, 2, 3, 2}; // I
a[1] = new double[]{0, 1, 2, 0}; // II
a[2] = new double[]{0, 0, 1, 3}; // III
int numLines = a.length;
int numCols = a[0].length;
double[][] t = new double[a.length][a[0].length];
for (int currentColumn = numCols - 2; currentColumn >= 0; currentColumn--) {
for (int currentLine = numLines - 1; currentLine >= 0; currentLine--) {
t[currentLine][currentColumn] = a[currentColumn][currentLine];
}
System.out.println();
}
ArrayTools.printMatrix(t);
数组 t 的 printMatrix 方法的控制台输出如下所示:
1.) 1.0 0.0 0.0 0.0
2.) 2.0 1.0 0.0 0.0
3.) 3.0 2.0 1.0 0.0
它非常接近我想要的,但我不知道如何从写入 t 中获取最后一列。
如果你们能向我解释这里发生了什么以及如何解决这个问题,我会很高兴!
你正在做的是(一部分)移调。您应该反转行和列。
int numLines = a.length;
int numCols = a[0].length;
double[][] t = new double[a.length][a[0].length];
for (int currentLine = 0; currentLine < numLines; currentLine++) {
for (int currentColumn = 0; currentColumn < numCols; currentColumn++) {
t[currentLine][currentColumn] =
a[numLines - 1 - currentLine][numCols - 1 - currentColumn];
}
}
您首先使用“行”作为第一个括号,“列”作为第二个:
int numLines = a.length;
int numCols = a[0].length;
但您稍后会以相反的方式使用它们:
a[currentColumn][currentLine];
你只需要把它反转为:
int numLines = a[0].length;
int numCols = a.length;
或:
double[][] t = new double[a[0].length][a.length];
t[currentColumn][currentLine] = a[currentLine][currentColumn];
您可以使用 streams
来反转二维数组。首先展平源数组并将其反转,然后从反转的平面数组中收集回二维数组:
// dimensions
int m = 3;
int n = 4;
// source array
double[][] arr1 = {
{1.0, 2.0, 3.0, 2.0},
{0.0, 1.0, 2.0, 0.0},
{0.0, 0.0, 1.0, 3.0}};
// flat array
Double[] arr2 = Arrays.stream(arr1)
.flatMapToDouble(Arrays::stream)
.boxed()
.toArray(Double[]::new);
// reverse a flat array
Collections.reverse(Arrays.asList(arr2));
// collect a 2d array from a reversed 1d array
double[][] arr3 = IntStream.range(0, m)
.mapToObj(i -> Arrays
.stream(arr2, i * n, i * n + n)
.mapToDouble(Double::doubleValue)
.toArray())
.toArray(double[][]::new);
// output
Arrays.stream(arr3).map(Arrays::toString).forEach(System.out::println);
[3.0, 1.0, 0.0, 0.0]
[0.0, 2.0, 1.0, 0.0]
[2.0, 3.0, 2.0, 1.0]
另请参阅:Sorting through entire 2d array in ascending order
您可以向后遍历此二维数组的行的索引,然后 clone
原始行,然后反转它们:
double[][] arr = {
{1.0, 2.0, 3.0, 2.0},
{0.0, 1.0, 2.0, 0.0},
{0.0, 0.0, 1.0, 3.0}};
double[][] nArr = IntStream
// iterate backwards through the indexes of the array rows
.iterate(arr.length - 1, i -> i >= 0, i -> i = i - 1)
// take the copy the row by its index
.mapToObj(i -> arr[i].clone())
// reverse the elements of the row
.peek(row -> {
// iterate to the middle of the row and swap the elements:
// first and last, second and penultimate, and so on
for (int i = 0; i < row.length / 2; i++) {
double temp = row[i];
row[i] = row[row.length - i - 1];
row[row.length - i - 1] = temp;
}
// return a new array
}).toArray(double[][]::new);
// output
Arrays.stream(nArr).map(Arrays::toString).forEach(System.out::println);
[3.0, 1.0, 0.0, 0.0]
[0.0, 2.0, 1.0, 0.0]
[2.0, 3.0, 2.0, 1.0]
我自学 Java 大约 6 个月,所以我对编码还很陌生,我需要你的帮助。 我想使用 2 个循环完全反转二维数组 (a) 并将其写入另一个数组,但是当我尝试更改行和列值时出现 OutOfBondsError。我好像不太明白这些嵌套循环是如何工作的...
起始数组a:
1.) 1.0 2.0 3.0 2.0
2.) 0.0 1.0 2.0 0.0
3.) 0.0 0.0 1.0 3.0
我的代码应该像这样反转。
目标数组 t:
1.) 3.0 1.0 0.0 0.0
2.) 0.0 2.0 1.0 0.0
3.) 2.0 3.0 2.0 1.0
final double[][] a = new double[3][];
a[0] = new double[]{1, 2, 3, 2}; // I
a[1] = new double[]{0, 1, 2, 0}; // II
a[2] = new double[]{0, 0, 1, 3}; // III
int numLines = a.length;
int numCols = a[0].length;
double[][] t = new double[a.length][a[0].length];
for (int currentColumn = numCols - 2; currentColumn >= 0; currentColumn--) {
for (int currentLine = numLines - 1; currentLine >= 0; currentLine--) {
t[currentLine][currentColumn] = a[currentColumn][currentLine];
}
System.out.println();
}
ArrayTools.printMatrix(t);
数组 t 的 printMatrix 方法的控制台输出如下所示:
1.) 1.0 0.0 0.0 0.0
2.) 2.0 1.0 0.0 0.0
3.) 3.0 2.0 1.0 0.0
它非常接近我想要的,但我不知道如何从写入 t 中获取最后一列。
如果你们能向我解释这里发生了什么以及如何解决这个问题,我会很高兴!
你正在做的是(一部分)移调。您应该反转行和列。
int numLines = a.length;
int numCols = a[0].length;
double[][] t = new double[a.length][a[0].length];
for (int currentLine = 0; currentLine < numLines; currentLine++) {
for (int currentColumn = 0; currentColumn < numCols; currentColumn++) {
t[currentLine][currentColumn] =
a[numLines - 1 - currentLine][numCols - 1 - currentColumn];
}
}
您首先使用“行”作为第一个括号,“列”作为第二个:
int numLines = a.length;
int numCols = a[0].length;
但您稍后会以相反的方式使用它们:
a[currentColumn][currentLine];
你只需要把它反转为:
int numLines = a[0].length;
int numCols = a.length;
或:
double[][] t = new double[a[0].length][a.length];
t[currentColumn][currentLine] = a[currentLine][currentColumn];
您可以使用 streams
来反转二维数组。首先展平源数组并将其反转,然后从反转的平面数组中收集回二维数组:
// dimensions
int m = 3;
int n = 4;
// source array
double[][] arr1 = {
{1.0, 2.0, 3.0, 2.0},
{0.0, 1.0, 2.0, 0.0},
{0.0, 0.0, 1.0, 3.0}};
// flat array
Double[] arr2 = Arrays.stream(arr1)
.flatMapToDouble(Arrays::stream)
.boxed()
.toArray(Double[]::new);
// reverse a flat array
Collections.reverse(Arrays.asList(arr2));
// collect a 2d array from a reversed 1d array
double[][] arr3 = IntStream.range(0, m)
.mapToObj(i -> Arrays
.stream(arr2, i * n, i * n + n)
.mapToDouble(Double::doubleValue)
.toArray())
.toArray(double[][]::new);
// output
Arrays.stream(arr3).map(Arrays::toString).forEach(System.out::println);
[3.0, 1.0, 0.0, 0.0]
[0.0, 2.0, 1.0, 0.0]
[2.0, 3.0, 2.0, 1.0]
另请参阅:Sorting through entire 2d array in ascending order
您可以向后遍历此二维数组的行的索引,然后 clone
原始行,然后反转它们:
double[][] arr = {
{1.0, 2.0, 3.0, 2.0},
{0.0, 1.0, 2.0, 0.0},
{0.0, 0.0, 1.0, 3.0}};
double[][] nArr = IntStream
// iterate backwards through the indexes of the array rows
.iterate(arr.length - 1, i -> i >= 0, i -> i = i - 1)
// take the copy the row by its index
.mapToObj(i -> arr[i].clone())
// reverse the elements of the row
.peek(row -> {
// iterate to the middle of the row and swap the elements:
// first and last, second and penultimate, and so on
for (int i = 0; i < row.length / 2; i++) {
double temp = row[i];
row[i] = row[row.length - i - 1];
row[row.length - i - 1] = temp;
}
// return a new array
}).toArray(double[][]::new);
// output
Arrays.stream(nArr).map(Arrays::toString).forEach(System.out::println);
[3.0, 1.0, 0.0, 0.0]
[0.0, 2.0, 1.0, 0.0]
[2.0, 3.0, 2.0, 1.0]