Как преобразовать двумерный массив в одномерный?

Дан на вход программы двумерный массив. Значения из него нужно записать в одномерный массив, по массиву пройтись "змейкой" и вывести на экран.

В моем коде выдает ошибку переполнения массива:

import java.util.Arrays;

public class SnakeArray {


    public static void main(String[] args) {
        SnakeArray snakeArray = new SnakeArray();
        snakeArray.toSnakeArray(new int[][]{{1, 2}, {4, 5}});
    }

    private void toSnakeArray(int[][] largeArray) {

        String[] smallArray = new String[largeArray[0].length + largeArray[1].length];

        for (int i = 0; i < smallArray.length; i++) {
            for (int j=0;j<smallArray.length;j++) {
            smallArray[i] = String.valueOf(largeArray[i][j]);
            }
            }

            System.out.println(Arrays.toString(smallArray));
        }
    }


  Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2 
SnakeArray.toSnakeArray(SnakeArray.java:20) 
SnakeArray.main(SnakeArray.java:11)

Ответы (1 шт):

Автор решения: Дмитрий

Старайтесь писать более универсальные методы. Что если массив состоит не из интов или матрица лохматая? Хотелось бы не переписывать код каждый раз. Кроме того, массивы, безусловно, имеют свои преимущества, однако в большинстве случаев использовать коллекции на много проще, особенно с учетом того, что ArrayList в себе по сути инкапсулирует этот самый массив, соответственно, получит массив в нужный момент не составит труда. И последнее... Зачастую проще использовать циклы без индексов либо стримы просто потому, что такой код читается проще и меньше шансов допустить ошибку.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SnakeArray {

    public static void main(String[] args) {
        SnakeArray snakeArray = new SnakeArray();
        List<Integer> result = snakeArray.toSnakeArray(new Integer[][]{{1, 2}, {4, 5}});
        System.out.println(Arrays.toString(result.toArray()));
    }

    private <T> List<T> toSnakeArray(T[][] array) {
        final List<T> result = new ArrayList<>();
        for (T[] arrays : array) result.addAll(Arrays.asList(arrays));
        return result;
    }

}
→ Ссылка