Вложенный список Java в преобразование массива

Каков наиболее эффективный способ преобразования данных из вложенных списков в массив объектов (который можно использовать, например, в качестве данных для 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);
}

Большое спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
0
13 930
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В частности, для 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[][].

Хороший ответ. Однако еще раз проверьте, что данные, переданные в эту модель, нигде не видны и подвержены редактированию ниндзя. Вероятно, это не так, но если это так, возможно, его нужно клонировать здесь.

Paul Brinkley 16.12.2008 19:57

Хорошая точка зрения. Я думал об этом, но DefaultTableModel на самом деле тоже не проверяет (он использует векторы). В любом случае, это самая простая из возможных реализаций. ;)

Michael Myers 16.12.2008 19:59
Ответ принят как подходящий
//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, но преобразовать список списков в массив можно с помощью нескольких строк.

Ответ 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]))

(Метод List.of был представлен в Java 9.)

Чтобы преобразовать вложенный список в двумерный массив объектов, вы можете использовать этот код:

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;
}

Другие вопросы по теме