Java 使用for循环的反向二维数组

Java 使用for循环的反向二维数组,java,arrays,for-loop,multidimensional-array,reverse,Java,Arrays,For Loop,Multidimensional Array,Reverse,我自学Java大约有6个月了,所以我对编码非常陌生,我需要你的帮助。 我想使用2个循环完全反转一个二维数组(a),并将其写入另一个数组中,但当我试图更改行和列的值时,出现了一个脱离边界的错误。似乎我不完全理解这些嵌套循环是如何工作的 启动阵列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

我自学Java大约有6个月了,所以我对编码非常陌生,我需要你的帮助。 我想使用2个循环完全反转一个二维数组(a),并将其写入另一个数组中,但当我试图更改行和列的值时,出现了一个脱离边界的错误。似乎我不完全理解这些嵌套循环是如何工作的

启动阵列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=新的double[3][];
a[0]=新的双[]{1,2,3,2};//我
a[1]=新的双精度[]{0,1,2,0};//二,
a[2]=新的双精度[]{0,0,1,3};//三,
int numLines=a.长度;
int numCols=a[0]。长度;
double[]t=新的双精度[a.length][a[0].length];
对于(int currentColumn=numColums-2;currentColumn>=0;currentColumn--){
对于(int currentLine=numLines-1;currentLine>=0;currentLine--){
t[currentLine][currentColumn]=a[currentColumn][currentLine];
}
System.out.println();
}
打印矩阵(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]。长度;
double[]t=新的双精度[a.length][a[0].length];
对于(int currentLine=0;currentLine
首先使用“行”作为第一个括号,“列”作为第二个括号:

int numLines=a.length;
int numCols=a[0]。长度;
但你以后会反过来使用它们:

a[currentColumn][currentLine];
您只需将其反转为:

int numLines=a[0]。长度;
int numCols=a.长度;
或:

double[]t=新的双精度[a[0].length][a.length];
t[currentColumn][currentLine]=a[currentLine][currentColumn];

您可以使用
反转2d数组。首先展平源阵列并将其反转,然后从反转的平面阵列收集回二维阵列:

//维度
int m=3;
int n=4;
//源阵列
双[][]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}};
//平面阵列
Double[]arr2=Arrays.stream(arr1)
.flatMapToDouble(数组::流)
.boxed()
.toArray(双[]::新);
//反转平面阵列
Collections.reverse(Arrays.asList(arr2));
//从反向一维阵列收集二维阵列
double[]arr3=IntStream.range(0,m)
.mapToObj(i->数组
.流(arr2,i*n,i*n+n)
.mapToDouble(双精度::双精度值)
.toArray())
.toArray(双[]]::新);
//输出
Arrays.stream(arr3).map(Arrays::toString.forEach(System.out::println);


另请参见:

您可以向后迭代此二维数组行的索引,然后是原始行,然后反转它们:

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(arr.length-1,i->i>=0,i->i=i-1)
//按其索引复制该行
.mapToObj(i->arr[i].clone())
//反转行中的元素
.peek(第行->{
//迭代到行中间并交换元素:
//第一个和最后一个,第二个和倒数第二个,依此类推
对于(int i=0;i
//输出
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]
[3.0, 1.0, 0.0, 0.0]
[0.0, 2.0, 1.0, 0.0]
[2.0, 3.0, 2.0, 1.0]