繁体   English   中英

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

[英]how to convert 2d array into 1d?

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

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

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

任何人都可以帮助我修复此代码?

这是我的代码

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循环中

好吧,如果您运行以下代码,

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[] ,每个长度为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] + " ");
        }
    }
}

使用循环并将一维数组分配为:

 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.lengtharray.length都将返回3,所以您的一维数组的大小为3,而您总共有9个元素

所以您不能使用它,现在,如果您的2D数组是一个正方形矩阵,那么您必须创建1D大小的Array

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

然后只需遍历2D数组并将每个元素插入到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];
    }
}

您定义的数组大小等于矩阵的行数。 它需要具有行*列元素。 当您遍历矩阵时,以合适的顺序填充数组。 这是一个例子:

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<IntArray>.toVector(): IntArray {
  if (this.isEmpty()) return IntArray(0)
  return this.reduce { firstArr, nextArr ->
    firstArr.plus(nextArr)
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM