Преобразование 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);`
БАМ! Один линия.
я не знаю, как быстро это по сравнению с другими вариантами. Но вот как это работает:
возьмите поток
mainList
2Д класса 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
СArrayList
object создаст новый массив типа, переданного в него. Здесь мы проходим вnew String[0]
. Поэтому он создает новый массив типаString[]
и с длиной, равной длине ArrayListu
. Затем он заполняет этот новый массив строк содержимым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]);
}
}