Как преобразовать список списков в двумерный массив в Java

Я придумал решение ниже, не уверен, что Type: предупреждения безопасности можно удалить, используя что-то еще.

BiFunction<List<List<T>>, Class<T>,T[][]> toArray = (list,type) ->
{
    T a[][] = (T[][]) Array.newInstance(type,
            list.size(), list.get(0).size());
    IntStream.range(0, a.length)
    .forEach(i -> {
        a[i]=(T[]) list.get(i).toArray();
    });
    return a;
};

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

List.toArray() без аргумента всегда будет возвращаться Object[] - вам также нужно будет создать соответствующие экземпляры для компонентов, а не только для большего массива. Откуда вы берете предупреждения?
RealSkeptic 08.04.2019 19:44

извините, но я не понимаю, что именно вы хотите сделать? преобразовать List<List<T>> в T[][]

YCF_L 08.04.2019 19:44

Я получаю предупреждения при первом задании, также я хотел бы сказать, что мне пришлось переписать метод, когда я тестировал его на матрице Integer, поэтому теперь я использую ниже BiFunction<List<List<T>>, Class<T>,T[][]> toArray = (list,type) -> { T a[][] = (T[][]) Array.newInstance(list.get(0).get(0).getClass(), list.size(), list.get(0).size()); IntStream.range(0, list.size()) .forEach(i -> { IntStream.range(0, list.get(0).size()) .forEach(j -> { a[i][j]=list.get(i).get(j); }); }); return a; };

Gabriel Hernandez 08.04.2019 22:38

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

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

Ответы 1

Ответ принят как подходящий

У меня есть два предложения: в обоих случаях преобразовать список из списка в список, повторяющий список списка, и добавить каждый элемент как T[] в новый список.

Используйте Array.newInstance только для создания вспомогательных объектов и добавьте аннотацию @SuppressWarnings.

    @SuppressWarnings("unchecked")
    public static <T> T[][] toArray(List<List<T>> list, Class<T> type) {

    T aux[] = (T[]) Array.newInstance(type, 0);
    T auxBi[][] = (T[][]) Array.newInstance(type, 0, 0);

    List<T[]> newList = new ArrayList<>();
    list.forEach(e -> newList.add(e.toArray(aux)));

    T[][] newBi = newList.toArray(auxBi);

    return newBi;
}

или

добавить auxliars в качестве параметров вместо тип

public static <T> T[][] toArray(List<List<T>> list, T aux[], T auxBi[][]) {

    List<T[]> newList = new ArrayList<>();
    list.forEach(e -> newList.add(e.toArray(aux)));

    T[][] newBi = newList.toArray(auxBi);

    return newBi;

}

Ценю этот ответ, это дало мне представление о том, чего я хотел достичь.

Gabriel Hernandez 09.04.2019 02:10

Решение выше с использованием потокового конвейера public BiFunction<List<List<T>>,Class<T>, T[][]> toArr = (list,type)-> list.stream().map(row -> row.toArray((T[]) Array.newInstance(type, 0))).collect(Collectors.toList()).toArray((T[][]) Array.newInstance(type, 0, 0));

Gabriel Hernandez 09.04.2019 02:11

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