2008-12-16 101 views
5

¿Cuál es la forma más eficiente de convertir datos de listas anidadas a una matriz de objetos (que se puede utilizar, por ejemplo, como datos para JTable)?Lista anidada de Java para la conversión de matriz

List<List> table = new ArrayList<List>(); 

for (DATAROW rowData : entries) { 
    List<String> row = new ArrayList<String>(); 

    for (String col : rowData.getDataColumn()) 
     row.add(col); 

    table.add(row); 
} 

// I'm doing the conversion manually now, but 
// I hope that there are better ways to achieve the same 
Object[][] finalData = new String[table.size()][max]; 
for (int i = 0; i < table.size(); i++) { 
    List<String> row = table.get(i); 

    for (int j = 0; j < row.size(); j++) 
     finalData[i][j] = row.get(j); 
} 

¡Muchas gracias!

Respuesta

5
//defined somewhere 
List<List<String>> lists = .... 

String[][] array = new String[lists.size()][]; 
String[] blankArray = new String[0]; 
for(int i=0; i < lists.size(); i++) { 
    array[i] = lists.get(i).toArray(blankArray); 
} 

No sé nada sobre JTable, pero la conversión de una lista de listas a una matriz se puede hacer con unas pocas líneas.

7

Para JTable, en particular, sugeriría subclases AbstractTableModel así:

class MyTableModel extends AbstractTableModel { 
    private List<List<String>> data; 
    public MyTableModel(List<List<String>> data) { 
     this.data = data; 
    } 
    @Override 
    public int getRowCount() { 
     return data.size(); 
    } 
    @Override 
    public int getColumnCount() { 
     return data.get(0).size(); 
    } 
    @Override 
    public Object getValueAt(int row, int column) { 
     return data.get(row).get(column); 
    } 
    // optional 
    @Override 
    public void setValueAt(Object aValue, int row, int column) { 
     data.get(row).set(column, aValue); 
    } 
} 

Nota: esta es la aplicación más básica posible; la verificación de errores se omite por brevedad.

Usando un modelo como este, no tiene que preocuparse por las conversiones sin sentido al Object[][].

+0

Buena respuesta. Sin embargo, vuelva a verificar que los datos pasados ​​a este modelo no sean visibles en ningún otro lugar y sean propensos a la edición de ninja. Probablemente no lo es, pero si lo es, puede que necesite ser clonado aquí. –

+0

Buen punto. Pensé en eso, pero DefaultTableModel en realidad tampoco marca (usa vectores). De todos modos, esta es la implementación más básica posible. ;) –

Cuestiones relacionadas