Преобразование ArrayList в 2D-массив, содержащий различные длины массивов

Так у меня:

ArrayList<ArrayList<String>> 

который содержит x количество ArrayLists, которые содержат другое y количество строк.. Чтобы продемонстрировать:

Index 0:
  String 1
  String 2
  String 3
Index 1:
  String 4
Index 2:
Index 3:
  String 5
  String 6

где index ссылается на индекс массива, содержащий строку.

как я могу преобразовать это в 2D массив, который выглядит так:

{{String1, String2, String3},{String4}, {}, {String5, String6}}

спасибо.

6 ответов


String[][] array = new String[arrayList.size()][];
for (int i = 0; i < arrayList.size(); i++) {
    ArrayList<String> row = arrayList.get(i);
    array[i] = row.toArray(new String[row.size()]);
}

здесь arrayList ваш ArrayList<ArrayList<String>> (или List<List<String>> измените первую строку внутри for петли соответственно)


Добро пожаловать в мир с Java 8!

мне потребовалась вся ночь без сна, чтобы узнать, что нужно, чтобы написать эту чертову строку кода. Я уверен, что он уже где-то там, но я не мог его найти. Так что я делюсь своими часами исследований, наслаждайтесь. Бут!

предположим:

ArrayList<ArrayList<String>> mainList = new ArrayList<ArrayList<String>>();
// populate this list here

(или, скорее, в Java 8:

ArrayList<ArrayList<String>> mainList = new ArrayList();
//Populate

)

тогда все, что вам нужно, это:

String[][] stringArray = mainList.stream().map(u -> u.toArray(new String[0])).toArray(String[][]::new);`

БАМ! Один линия.

я не знаю, как быстро это по сравнению с другими вариантами. Но вот как это работает:

  1. возьмите поток mainList 2Д класса ArrayList. Этот поток немного похож на вектор, подключенный к LinkedList, и у них был ребенок. И этот ребенок, позже в жизни, накачался чем-то НЗТ-48. Я отвлекся;mainList.stream() возвращает поток ArrayList<String> элементы. Или в еще более вызывающе говорят:mainList.stream() возвращает Stream<ArrayList<String>>, вроде.

  2. вызов .map функция в этом потоке, которая вернет новый поток с содержимым, соответствующим новому типу, указанному параметрами, переданными в map. Это map функция будет скрывать каждый элемент в нашем потоке для нас. Он имеет встроенный foreach заявление. Для того, чтобы достичь этого; - это идентификатор, который вы выбираете так же, как при использовании foreach заявление. Первая половина заявляет об этом так:u ->. И как foreach переменная u теперь будет каждый элемент в потоке как это проходит через ручей. Таким образом, u имеет тип данных, что элементы исходного потока, потому что это is них. Правая половина лямбда-выражения показывает, что делать с каждым элементом: u.toArray(new String[0]). С результатами, хранящимися на своем законном месте в новом потоке. В этом случае мы преобразуем его в String[].. потому что в конце концов, это 2D массив String.. или, скорее, с этого момента в коде, 1D массив String[] (строковых массивов). Имейте в виду, что u в конечном счете ArrayList. Заметьте, звонит toArray С ArrayList object создаст новый массив типа, переданного в него. Здесь мы проходим в new String[0]. Поэтому он создает новый массив типа String[] и с длиной, равной длине ArrayList u. Затем он заполняет этот новый массив строк содержимым ArrayList и возвращает его. Что оставляет лямбда-выражение и обратно в map. Затем:map собирает эти строковые массивы и создает новый поток с ними, он имеет связанный тип String[] и затем возвращает его. Следовательно,map возвращает Stream<String[]> в этом случае. (Ну, на самом деле он возвращает Stream<Object[]>, что сбивает с толку и требует преобразования, см. ниже)

  3. поэтому нам просто нужно позвонить toArray в этом новом потоке массивов строк. Но зовет!--28--> на Stream<Object[]> немного отличается от вызова его на ArrayList<String>, как и раньше. Здесь мы должны использовать ссылку на функцию запутанная штука. Он захватывает тип из этого:String[][]::new. Это


можно использовать toArray() метод преобразования ArrayList в массив. Поскольку у вас есть ArrayList в ArrayList, вам нужно будет перебрать каждый элемент и применить этот метод.

что-то вроде этого:-

ArrayList<ArrayList<String>> mainList = new ArrayList<ArrayList<String>>();
// populate this list here
//more code

// convert to an array of ArrayLists
ArrayList<String[]> tempList = new ArrayList<String[]>();
for (ArrayList<String> stringList : mainList){
    tempList.add((String[])stringList.toArray());
}

//Convert to array of arrays - 2D array
String [][]list = (String[][])tempList.toArray();

вы можете узнать больше о toArray() здесь.


ArrayList<ArrayList<String>> list= new ArrayList<ArrayList<String>>();
          ArrayList<String> a = new ArrayList<String>();
          ArrayList<String> b = new ArrayList<String>();
          a.add("Hello");
          b.add("Hell");
          list.add(a);
          list.add(b);
          Object[][] array = new Object[list.size()][];
          Iterator<ArrayList<String>> iterator = list.iterator();
          int i = 0;
          while(iterator.hasNext()){
              array[i] = iterator.next().toArray();
          }

вы можете использовать приведенный ниже фрагмент для преобразования Object[] в String[]

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);

например:

public String[][] toArray(List<List<String>> list) {
    String[][] r = new String[list.size()][];
    int i = 0;
    for (List<String> next : list) {
       r[i++] = next.toArray(new String[next.size()]);
    }
    return r;
}

этот полный код мини-программы отвечает на этот вопрос вполне понятным образом.Просто вставьте и запустите его:

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

public class ListTo2Darray {

    public String[][] toArray(List<List<?>> list) {
    String[][] r = new String[list.size()][];
    int i = 0;
    for (List<?> next : list) {
       r[i++] = next.toArray(new String[next.size()]);
    }
    return r;
}

    public static void main(String[]arg){
        String[][] sham;

        List<List<?>> mList = new ArrayList();

        List<String> a= new ArrayList();
        List<String> b= new ArrayList();
        a.add("a");  a.add("a");
        b.add("b");  b.add("b");
        mList.add(a); mList.add(b); 

        ListTo2Darray mt= new ListTo2Darray();
        sham=   mt.toArray(mList);

        System.out.println(sham[0][0]);
        System.out.println(sham[0][1]);
        System.out.println(sham[1][0]);
        System.out.println(sham[1][1]);
    }

}