如何将2D数组转换为1D?

我有一个代码,使用用户输入创建2d数组,它工作正常,但现在我有2个问题

第一个:如何将2D数组转换为1D数组?

第二个问题:如何选择或追踪二维数组右上对角线以上的元素?

任何人都可以帮我解决这个问题?

这是我的代码

package question3; import java.util.Arrays; import java.util.Collection; import java.util.Scanner; public class Array2d { public static void main(String[] args) { int[][] matrix = new int[3][3]; int[] array = new int[matrix.length * matrix.length]; Scanner sc = new Scanner(System.in); System.out.print("Please enter 9 integers separated by spaces:"); for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix.length; j++) { matrix[i][j] = sc.nextInt(); } } int idx = 0; for (int row = 0; row < matrix.length; row++) { for (int column = 0; column < matrix.length; column++) { System.out.print(matrix[row][column] + " "); // Outputs the // array in a // 5x5 grid. } System.out.println(); } for (int column = 0; column < matrix.length; column++) { for (int row = column + 1; row < matrix.length+column ; row++){ // populate your array here array[idx] = matrix[row][column]; // increment index idx++; System.out.println(matrix[row][column]); } } } } 

产量

请输入以空格分隔的9个整数:1 2 3 4 5 6 7 8 9

1 2 3

4 5 6

7 8 9

4 7 8

但我期待2,3,6

在那里我需要做的变化,因为我卡住了,我知道是在第三个循环

那么如果你运行下面的代码,

 public class Main { public static void main(String[] args) { int[][] matrix = new int[5][6]; System.out.println(matrix.length); int[] matrix2 = matrix[4]; System.out.println(matrix2.length); } } 

你会看到它打印出来

 5 6 

所以最初你有一个长度为5的数组,并且包含5个长度为6 int[]

因此它被存储在模式中

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 

那么你想要把这些放到一个数组中呢? 你需要从右到左,然后每一次下来。

  int newArray[] = new int[matrix.length*matrix[0].length]; for(int i = 0; i < matrix.length; i++) { int[] row = matrix[i]; for(int j = 0; j < row.length; j++) { int number = matrix[i][j]; newArray[i*row.length+j] = number; } } 

这应该工作。

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 

完整的代码来看看你自己:

 public class Main { public static void main(String[] args) { int[][] matrix = new int[5][6]; int counter = 1; for(int i = 0; i < 5; i++) { for(int j = 0; j < 6; j++) { matrix[i][j] = counter++; } } int newArray[] = new int[matrix.length*matrix[0].length]; for(int i = 0; i < matrix.length; i++) { int[] row = matrix[i]; for(int j = 0; j < row.length; j++) { int number = matrix[i][j]; newArray[i*row.length+j] = number; } } for(int i = 0; i < newArray.length; i++) { System.out.print(newArray[i] + " "); } } } 

matrix.lengtharray.length都会返回3,所以你的一维数组的大小是3,而你总共有9个元素

所以你不能使用这个,现在如果你的二维数组是一个正方形矩阵,那么你必须创建一个数组的大小

  int[] array = new int[matrix.length * matrix.length]; 

然后简单地遍历二维数组,并将每个元素插入到1D数组中作为@Prashant建议进行一点修改

 int k = 0; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { array[k++] = matrix[i][j]; } } 

使用循环并将1-d数组分配为:

  int[] array = new int[matrix.length * matrix[0].length]; int k = 0; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix.length; j++) { array[k++] = matrix[i][j]; } } 

您已经定义了数组大小等于矩阵的行数。 它需要有行*列元素。 按照您认为合适的顺序遍历矩阵填充数组。 这是一个例子:

 package question3; import java.util.Arrays; import java.util.Scanner; public class Array2d { public static void main(String[] args) { int[][] matrix = new int[3][3]; // array must have row * col elements to hold the entire matrix int[] array = new int[matrix.length * matrix[0].length]; Scanner sc = new Scanner(System.in); System.out.println("Please enter 9 integers separated by spaces:"); for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix.length; j++) { matrix[i][j] = sc.nextInt(); } } // Index to step through array int idx = 0; for (int row = 0; row < matrix.length; row++) { for (int column = 0; column < matrix.length; column++) { System.out.print(matrix[row][column] + " "); // populate your array here array[idx] = matrix[row][column]; // increment index idx++; } System.out.println(); } System.out.println("the Matrix becomes " + Arrays.toString(array)); for (int row = 0; row < matrix.length; row++) { for (int column = 0; column < matrix[row].length - row - 1; column++) { // Work with matrix above right diagonal here, matrix[row][column]; System.out.println(matrix[row][column]); } } } } 

二维数组的第一个索引是行,第二个索引是列。 你有他们在第二个for循环命名不正确。

要访问从左下角到右上角的对角线上的所有内容(不包括对角线),请逐行读入每行,然后逐行读取但不包括行长度 - 行索引。 像这样的东西:

 for (int row = 0; row < matrix.length; row++) { for (int column = 0; column < matrix[row].length - row - 1; column++) { // Work with matrix above right diagonal here, matrix[row][column]; System.out.println(matrix[row][column]); } } 

用Kotlin,你可以做;

 fun Array.toVector(): IntArray { if (this.isEmpty()) return IntArray(0) return this.reduce { firstArr, nextArr -> firstArr.plus(nextArr) } } 

这将返回一个包含2D数组的所有行的int数组。