2014-11-04 4 views
9

Sto provando a convertire un elenco annidato in un array 2D.Converti elenco nidificato in array 2d

List<List<String>> list = new ArrayList<>(); 

list.add(Arrays.asList("a", "b", "c")); 
list.add(Arrays.asList("dd")); 
list.add(Arrays.asList("eee", "fff")); 

Voglio rendere questo uno String[][]. Ho provato il seguente:

String[][] array = (String[][]) list.toArray();  // ClassCastException 

String[][] array = list.toArray(new String[3][3]); // ArrayStoreException 

String[][] array = (String[][]) list.stream()  // ClassCastException 
    .map(sublist -> (String[]) sublist.toArray()).toArray(); 

C'è un modo che funziona? Si noti che non conoscerò la dimensione della lista fino al runtime e potrebbe essere frastagliata.

+0

Non hai cercato di farlo manualmente con due annidati 'loop for'? – Tom

risposta

8

Non esiste un modo semplice per eseguire ciò che si desidera perché il proprio toArray può restituire solo una serie di elementi memorizzati nell'elenco che nel vostro caso sarebbero anche elenchi.

La soluzione più semplice sarebbe creare un array bidimensionale e riempirlo con i risultati di toArray da ciascuno degli elenchi annidati.

String[][] array = new String[list.size()][]; 

int i = 0; 
for (List<String> nestedList : list) { 
    array[i++] = nestedList.toArray(new String[nestedList.size()]); 
} 

(si può ridurre questo codice se si utilizza Java 8 con i flussi proprio come Alex did)

14

Si potrebbe fare questo:

String[][] array = list.stream() 
    .map(l -> l.stream().toArray(String[]::new)) 
    .toArray(String[][]::new); 

crea una Stream<List<String>> dal tuo elenco di liste , quindi da quello utilizza map per sostituire ciascuno degli elenchi con una matrice di stringhe che risulta in un Stream<String[]>, quindi chiama infine toArray (con una funzione di generatore, invece del parametro no versione) su quello per produrre il String[][].

-1

leggermente più breve di quanto la risposta di Alex:

final List<List<String>> list = ...; 
final String[][] array = list.stream().map(List::toArray).toArray(String[][]::new);