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