如何将二维数组转换为一维数组?
how to convert 2d array into 1d?
我有一个使用用户输入创建二维数组的代码,它工作正常,但现在我有 2 个问题
第一个:如何将二维数组转为一维数组?
第二个问题:如何选择或追踪二维数组中右对角线以上的元素?
谁能帮我修正这段代码?
这是我的代码
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
我需要做的改变,因为我被卡住了,我知道那是在第三个 for 循环中
使用循环并将一维数组分配为:
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];
}
}
matrix.length
和 array.length
都将 return 3 ,因此您的一维数组的大小为 3 而您总共有 9 个元素
所以你不能使用这个,现在如果你的二维数组是一个方阵那么你必须创建 1 DArray of size
int[] array = new int[matrix.length * matrix.length];
然后简单地遍历 2 维数组并将每个元素插入 1 维数组,正如@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];
}
}
您定义的数组大小等于矩阵的行数。它需要有行 * 列元素。按照您认为合适的顺序遍历矩阵时填充数组。这是一个例子:
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]);
}
}
好吧,如果你运行下面的代码,
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 个 int[]
,每个长度为 ˛6
。
因此以
的模式存储
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] + " ");
}
}
}
有了 Kotlin,你就可以做到;
fun Array<IntArray>.toVector(): IntArray {
if (this.isEmpty()) return IntArray(0)
return this.reduce { firstArr, nextArr ->
firstArr.plus(nextArr)
}
}
这将 return 一个由二维数组的所有行组成的 int 数组。
我有一个使用用户输入创建二维数组的代码,它工作正常,但现在我有 2 个问题
第一个:如何将二维数组转为一维数组?
第二个问题:如何选择或追踪二维数组中右对角线以上的元素?
谁能帮我修正这段代码?
这是我的代码
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
我需要做的改变,因为我被卡住了,我知道那是在第三个 for 循环中
使用循环并将一维数组分配为:
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];
}
}
matrix.length
和 array.length
都将 return 3 ,因此您的一维数组的大小为 3 而您总共有 9 个元素
所以你不能使用这个,现在如果你的二维数组是一个方阵那么你必须创建 1 DArray of size
int[] array = new int[matrix.length * matrix.length];
然后简单地遍历 2 维数组并将每个元素插入 1 维数组,正如@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];
}
}
您定义的数组大小等于矩阵的行数。它需要有行 * 列元素。按照您认为合适的顺序遍历矩阵时填充数组。这是一个例子:
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]);
}
}
好吧,如果你运行下面的代码,
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 个 int[]
,每个长度为 ˛6
。
因此以
的模式存储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] + " ");
}
}
}
有了 Kotlin,你就可以做到;
fun Array<IntArray>.toVector(): IntArray {
if (this.isEmpty()) return IntArray(0)
return this.reduce { firstArr, nextArr ->
firstArr.plus(nextArr)
}
}
这将 return 一个由二维数组的所有行组成的 int 数组。