将数据从嵌套列表转换为对象数组(可以用作JTable数据)的最有效方法是什么?
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);
}
非常感谢!
答案 0 :(得分:7)
尤其对于JTable
,我建议像这样对AbstractTableModel
进行子类化:
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);
}
}
注意:这是最基本的实现;为简洁起见,省略了错误检查。
使用这样的模型,您不必担心Object[][]
的无意义转换。
答案 1 :(得分:7)
//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);
}
我对JTable一无所知,但将列表列表转换为数组可以用几行完成。
答案 2 :(得分:0)
Java 11答案。
List<List<String>> table = List.of(List.of("A", "B"), List.of("3", "4"));
String[][] finalData = table.stream()
.map(arr -> arr.toArray(String[]::new))
.toArray(String[][]::new);
System.out.println(Arrays.deepToString(finalData));
[[A,B],[3,4]]
Collection.toArray(IntFunction<T[]> generator)
方法是Java 11中的新方法。
当然,您也可以在Java 8+中使用流。只需使用此映射即可:
.map(arr -> arr.toArray(new String[0]))
(Java 9中引入了List.of
方法。)
答案 3 :(得分:0)
要将嵌套列表转换为二维对象数组,可以使用以下代码:
public Object[][] ToObjectMatrix(List<List<String>> data) throws IllegalArgumentException {
if(data == null) {
throw new IllegalArgumentException("Passed data was null.");
}
Object[][] result = new Object[data.size()][];
for(int i = 0; i < data.size(); i++) {
result[i] = data.get(i).toArray();
}
return result;
}