如何将一个二维数组合并为一个一维数组?

4
我很难想象如何将多维数组合并为一个单一的数组。
以下是我的代码:
        String[][] multiArray = {{"1","2","3"},{"4","5","6"}};
    String[] singleArray = new String[6];

    for(int i=0; i<singleArray.length; i++)
    {
        for(int x=0; x<multiArray.length; x++)
        {
            for(int z=0; z<multiArray[x].length;z++)
            {
                //for(int i=0; i<singleArray.length; i++)
                //{
                singleArray[i] = multiArray[x][z];  
                //}
            }
        }
    }


    for(String temp : singleArray){
        System.out.println(temp);
    }

结果是

6  
6  
6  
6  
6  
6  

为什么呢?我怎样才能将所有数字放到一个单一的数组中呢? 非常感谢!

请检查您的流程,singleArray[i] 应该是其他东西,比如 singleArray[k],其中 k 从0开始,直到multiarray中的元素数。 - Gaur93
7个回答

4
String[][] multiArray = {{"1","2","3"},{"4","5","6"}};
String[] strings = Arrays.stream(multiArray)
        .flatMap(Arrays::stream)
        .toArray(size -> new String[size]);

3

您需要为多维数组中的每个条目递增1维数组的索引:

String[][] multiArray = {{"1","2","3"},{"4","5","6"}};
String[] singleArray = new String[6];

for (int x = 0, i = 0; x < multiArray.length; x++) {
    for (int z = 0; z < multiArray[x].length; z++) {
        singleArray[i++] = multiArray[x][z];  
    }
}

请注意,i在外层循环中初始化,并且在为一维数组赋值时递增。
另一个等效的替代方案是在内层循环中递增i
for (int x = 0, i = 0; x < multiArray.length; x++) {
    for (int z = 0; z < multiArray[x].length; z++, i++) {
        singleArray[i] = multiArray[x][z];  
    }
}

1
如何使用集合(collections)?
    String[][] multiArray = {{"1","2","3"},{"4","5","6"}};

    List<String> result = new ArrayList<>();
    for(String[] firstLevel : multiArray){
        for(String secondLevel : firstLevel){
            result.add(secondLevel);
        }
    }
    return result.toArray();

1
在您的代码中,您开始迭代您想要存储所有值的数组。您不应该开始迭代它,因为它没有数据。
逻辑很简单:您应该迭代您拥有的元素,读取每个元素并将其添加到目标数组中。
您首先循环一维数组,然后嵌套循环二维数组,现在您可以读取两维数组的每个数据。
String[][] multiArray = { { "1", "2", "3" }, { "4", "5", "6" } };
String[] singleArray = new String[multiArray[0].length + multiArray[1].length];

int i = 0;
for (int j = 0; j < multiArray.length; j++) { // first dimension [j]
    for (int k = 0; k < multiArray[j].length; k++) {  // second dimension [k]
      singleArray[i] = multiArray[j][k]; // here you get [j][k] 
      i++; // you go to next position of destination array  
           // when you had an entry
    }   
}

1
你的代码不合逻辑。在增加单一数组索引之前,你遍历了多维数组的所有值。这就是为什么每个单一数组项都包含多维数组的最后一个项。
你应该避免遍历单一数组,并使用计数器来写入其值。尝试这样做:
String[][] multiArray = {{"1","2","3"},{"4","5","6"}};
String[] singleArray = new String[6];

int counter=0;
for(int x=0; x<multiArray.length; x++)
{
    for(int z=0; z<multiArray[x].length;z++)
    {
        singleArray[counter] = multiArray[x][z]; 
        counter++: 
    }
}



for(String temp : singleArray){
    System.out.println(temp);
}

1
实际上,在您的代码中,i的值没有改变,没有必要将i作为所有循环的父级,您只需要在每个更新步骤后递增i的值即可。
  int i=0;
  while (i<singleArray.length)
   {
    for(int x=0; x<multiArray.length; x++)
    {
        for(int z=0; z<multiArray[x].length;z++)
        {


            singleArray[i++] = multiArray[x][z];  

        }
    }
}


for(String temp : singleArray){
    System.out.println(temp);
}

1
故障在于变量i,它表示singleArray的索引,在内部两个循环的每个完整迭代中更新一次。因此,对于i的每个值,在最外层循环的每次迭代中,single[i]都会不断获取从1到6的所有值。这就是为什么1-D数组中的所有索引都具有最后一个值即6。你需要做的是每次向singleArray添加值时使用后缀递增运算符增加i的值。不要在循环中执行此操作。
int i=0; //starting index
for(int x=0; x<multiArray.length; x++)
{
    for(int z=0; z<multiArray[x].length;z++)
    {
        singleArray[i++] = multiArray[x][z];
        /* i's value is changed every time a value is added to
            singleArray */
    }
}

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