将一个二维数组转换为一维数组

14

这是目前我所拥有的代码:

 public static int mode(int[][] arr) {
      ArrayList<Integer> list = new ArrayList<Integer>();
      int temp = 0;
      for(int i = 0; i < arr.length; i ++) {
          for(int s = 0; s < arr.length; s ++) {
              temp = arr[i][s];

我似乎卡在了如何将[i][s]转换成一维数组的这个点上。当我执行print(temp)时,我的2D数组的所有元素按顺序一个接一个地打印出来,但无法弄清如何将它们放入1D数组中。我是一个新手:(

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

我目前正在处理的2D数组是3x3的。如果背景有任何重要性,我正在尝试找到所有整数的数学众数。


2
我修改了你的问题,使其始终为2D->1D。请在以后更加注意这些细节,它们非常重要。 - Andrew Thompson
8个回答

13

在Java 8中,您可以使用对象流将矩阵映射到向量。

将任意类型和任意长度的对象矩阵转换为向量(数组)

String[][] matrix = {
    {"a", "b", "c"},
    {"d", "e"},
    {"f"},
    {"g", "h", "i", "j"}
};

String[] array = Stream.of(matrix)
                       .flatMap(Stream::of)
                       .toArray(String[]::new);

如果你正在寻找一个与 int 相关的方法,我会选择:

int[][] matrix = {
    {1, 5, 2, 3, 4},
    {2, 4, 5, 2},
    {1, 2, 3, 4, 5, 6},
    {}
};

int[] array = Stream.of(matrix) //we start with a stream of objects Stream<int[]>
                    .flatMapToInt(IntStream::of) //we I'll map each int[] to IntStream
                    .toArray(); //we're now IntStream, just collect the ints to array.

10

你几乎做对了,只需要微小的改动:

public static int mode(int[][] arr) {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < arr.length; i++) {
        // tiny change 1: proper dimensions
        for (int j = 0; j < arr[i].length; j++) { 
            // tiny change 2: actually store the values
            list.add(arr[i][j]); 
        }
    }

    // now you need to find a mode in the list.

    // tiny change 3, if you definitely need an array
    int[] vector = new int[list.size()];
    for (int i = 0; i < vector.length; i++) {
        vector[i] = list.get(i);
    }
}

非常感谢,我已经为这个问题苦思冥想了相当长的一段时间了,哈哈。 - Kristopher

5
我不确定您是想将您的二维数组转换为一维数组(正如您的问题所述),还是将您的二维数组中的值放入您拥有的ArrayList中。我将假定您是前者,但我很快会说,对于后者,您只需要调用list.add(temp),尽管在您当前的代码中实际上不需要temp
如果您想要一个一维数组,则以下代码应该足够:
public static int mode(int[][] arr)
{
  int[] oneDArray = new int[arr.length * arr.length];
  for(int i = 0; i < arr.length; i ++)
  {
    for(int s = 0; s < arr.length; s ++)
    {
      oneDArray[(i * arr.length) + s] = arr[i][s];
    }
  }
}

1
这是正确的 - 我做出了这个假设,因为原始代码中有这个假设 - 也许我应该把这一点说得更清楚。 - epochengine

3

change to:

 for(int i = 0; i < arr.length; i ++) {
          for(int s = 0; s < arr[i].length; s ++) {
              temp = arr[i][s];

3

"如何将二维数组转换为一维数组?"

        String[][] my2Darr = .....(something)......
        List<String> list = new ArrayList<>();
        for(int i = 0; i < my2Darr.length; i++) {
            list.addAll(Arrays.asList(my2Darr[i])); // java.util.Arrays
        }
        String[] my1Darr = new String[list.size()];
        my1Darr = list.toArray(my1Darr);

1
这里不允许使用原始类型。 - Mr. Mak

2

我知道这个问题已经有答案了,但我想分享一下我的看法。这个函数将接收一个二维数组的输入,并返回一个一维数组的输出。

public int[] output(int[][] input){
    int[] out = new int[input.length * input[0].length]
    for (int i = 0; i < input.length; i++) {
        for (int j = 0; j < input[i].length; j++) { 
            out[i + (j * input.length)] = input[i][j]
        }
    }
    return out;
}

1
import java.util.*;


public class Main {
    
    public static int A[][] = new int[3][3];
    public static int B[] = new int[9];

    
    
    
    public static void main(String[] args) {
        
        
        int temo = 0,t;
        
        Scanner s = new Scanner(System.in);
         
         System.out.println("Enter No for Matrix A");
         
         for (int row = 0; row < A.length; row++) {
                for (int col = 0; col < A.length; col++) {
                    A[row][col] = s.nextInt();
                }
                System.out.print("\n");
            }
         
        
         for (int row = 0; row < A.length; row++) {
                for (int col = 0; col < A.length; col++) {
                        t= A[row][col];
                        B[temo]= t;
                        temo++;
                    
                }
                System.out.print("\n");
            }
         
         System.out.print("After Converted to one d \n");
         for(int i =0;i<B.length;i++) {
             System.out.print(" "+B[i]+" ");
         }
         
    }

}

1

System.arraycopy应该比我们能写的任何东西都要快。此外,使用内置的Java迭代器来处理行。这是一个双重数组的示例。您应该能够使用任何类型或类。如果您的行长度都相同,则totalNumberElements = array2D.length * array2D[0].length;

static double[] doubleCopyToOneD(double[][] array2D, int totalNumberElements) {
    double[] array1D = new double[totalNumberElements];
    int pos = 0;
    for (double[] row: array2D) {
        System.arraycopy(row, 0, array1D, pos, row.length);
        pos += row.length;
    }
    return array1D;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接