Конвертация двумерного массива в ArrayList

376
09 февраля 2018, 20:43

Есть метод, который конвертирует двумерный массив в ArrayList.

public List<Integer> toList (int[][] array) {
    List list = new ArrayList();
    for (int[] i : array) {
        list.addAll(Arrays.asList(i));
    }
    return list;
}

Вызываю его.

 public static void main(String[] args) {
   ConvertList convertList = new ConvertList();
   System.out.println("Массив: " + convertList.toList(new int[][]{{1, 2}, {3, 4}}));

}

И что получаю в итоге: Массив: [[I@1540e19d, [I@677327b6].

Объясните пожалуйста, что я делаю не так? Заранее спасибо за ответы.

Answer 1

Метод Arrays.asList(T... a) принимает параметр вида T... a, что означает массив объектов типа T. Ошибка в том, что вы в голове подразумеваете под типом T в данном случае тип int, но int - это примитив, и он не может быть дженериком. Поэтому в качестве T понимается объект типа int[]

В итоге в вашем list лежит 2 элемента с типом int[], выглядит это так:

1: [1,2]

2: [3,4]

Для исправления предлагаю 2 способа:

  1. Заменить примитивный тип int на Integer

    System.out.println("Массив: " + toList(new Integer[][]{{1, 2}, {3, 4}}) 
    //........
    //........
    public List<Integer> toList (Integer[][] array) {
        List list = new ArrayList();
        for (Integer[] i : array) {
            list.addAll(Arrays.asList(i));
        }
        return list;
    } 
    
  2. Разворачивать внутренний массив руками

    public List<Integer> toList (int[][] array) {
        List list = new ArrayList();
        for (int[] i : array) {
            for(int j : i){
                list.add(j);
            }
        }
        return list;
    }
    

Да, собственно, если бы вы объявили переменную List list правильно, как List<Integer> list, то ваш код даже не скомпилировался бы, в вашем же случае есть всего лишь warning, на который стоило бы обратить внимание.

READ ALSO
Как остановить поток main, пока все ArrayBlockingQueue не выполнятся?

Как остановить поток main, пока все ArrayBlockingQueue не выполнятся?

Как остановить поток main, пока все ArrayBlockingQueue не выполнятся? То есть, существует main поток в котором я запускаю другие потоки для выполнения...

287
JSON and JAVA (android)

JSON and JAVA (android)

в моем приложения (андроид) я получаю с сервера jsonПосле при оброботке

224
Physicaloid library Arduino + Android

Physicaloid library Arduino + Android

Никак не могу разобраться как создать цикл чтения Serial Monitor'a при помощи библиотеки Physicaloid libraryА выход из этого цикла должен совершаться только...

293