Преобразование 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);`
БАМ! Один линия.
я не знаю, как быстро это по сравнению с другими вариантами. Но вот как это работает:
- возьмите поток - mainList2Д класса ArrayList. Этот поток немного похож на вектор, подключенный к LinkedList, и у них был ребенок. И этот ребенок, позже в жизни, накачался чем-то НЗТ-48. Я отвлекся;- mainList.stream()возвращает поток- ArrayList<String>элементы. Или в еще более вызывающе говорят:- mainList.stream()возвращает- Stream<ArrayList<String>>, вроде.
- вызов - .mapфункция в этом потоке, которая вернет новый поток с содержимым, соответствующим новому типу, указанному параметрами, переданными в- map. Это- mapфункция будет скрывать каждый элемент в нашем потоке для нас. Он имеет встроенный- foreachзаявление. Для того, чтобы достичь этого; - это идентификатор, который вы выбираете так же, как при использовании- foreachзаявление. Первая половина заявляет об этом так:- u ->. И как- foreachпеременная- uтеперь будет каждый элемент в потоке как это проходит через ручей. Таким образом,- uимеет тип данных, что элементы исходного потока, потому что это is них. Правая половина лямбда-выражения показывает, что делать с каждым элементом:- u.toArray(new String[0]). С результатами, хранящимися на своем законном месте в новом потоке. В этом случае мы преобразуем его в- String[].. потому что в конце концов, это 2D массив- String.. или, скорее, с этого момента в коде, 1D массив- String[](строковых массивов). Имейте в виду, что- uв конечном счете- ArrayList. Заметьте, звонит- toArrayС- ArrayListobject создаст новый массив типа, переданного в него. Здесь мы проходим в- new String[0]. Поэтому он создает новый массив типа- String[]и с длиной, равной длине ArrayList- u. Затем он заполняет этот новый массив строк содержимым- ArrayListи возвращает его. Что оставляет лямбда-выражение и обратно в- map. Затем:- mapсобирает эти строковые массивы и создает новый поток с ними, он имеет связанный тип- String[]и затем возвращает его. Следовательно,- mapвозвращает- Stream<String[]>в этом случае. (Ну, на самом деле он возвращает- Stream<Object[]>, что сбивает с толку и требует преобразования, см. ниже)
- поэтому нам просто нужно позвонить - 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]);
    }
}
