Не получается преобразовать список из строк в двумерный массив в java

Рейтинг: 0Ответов: 3Опубликовано: 15.08.2023
public static String[][] toMatrix(List<String> data) {
    return data.stream()
        .map(str -> str.chars().mapToObj(e -> (char)e).collect(Collectors.toList()).stream().toArray(String[]::new))
        .toArray(String[][]::new);
} 

код должен из ["aaa", "bbb", "ccc"] сделать [[a,a,a], [b,b,b], [c,c,c]]

Ответы

▲ 1Принят

Решение тривиально -- просто каждая строка списка записывается в свой массив:

public static String[][] toMatrix(List<String> data) {
    return data.stream()               // Stream<String>
        .map(s -> new String[]{s})     // Stream<String[]>
        .toArray(String[][]::new);     // String[][]
}
System.out.println(Arrays.deepToString(
    toMatrix(List.of("aaa", "bbb", "ccc"))
));
[[aaa], [bbb], [ccc]]

Создать массив из одного элемента-строки можно и "длинным" путём через .map(s -> Stream.of(s).toArray(String[]::new)), но в данном случае создание стрима для того, чтобы сразу же вызвать его метод toArray явно лишнее.


Обновление первоначальная хотелка была радикально изменена на получение побуквенных массивов для каждой строки.

Разбить строку на массив символов легко при помощи операции String::split(""):

public static String[][] toCharMatrix(List<String> data) {
    return data.stream()           // Stream<String>
        .map(s -> s.split(""))     // Stream<String[]>
        .toArray(String[][]::new); // String[][]
}
System.out.println(Arrays.deepToString(
    toCharMatrix(List.of("aaa", "bbb", "ccc"))
));
[[a, a, a], [b, b, b], [c, c, c]]
▲ 2
public static String[][] toMatrix(List<String> data) {
    return data.stream().map(
            s -> s.chars().mapToObj(
                    c -> String.valueOf((char)c)
            ).toArray(String[]::new)
        ).toArray(String[][]::new);
}

У Вас выражение (char)e).collect(Collectors.toList()).stream() имеет тип Stream<Character>, его нельзя свернуть в String[], только в Character[]

▲ 0
List<String>data = new ArrayList<>(List.of("aaa","bbb","ccc"));

String [][] result = new String[data.size()][1];
final int[] i = {0}; // 

Arrays.stream(result)
                .forEach(row -> row[0] = data.get(i[0]++));

for (String[] row : result) {
            System.out.println(Arrays.toString(row));
}

Выход:

[aaa]
[bbb]
[ccc]

Process finished with exit code 0

Все решается обычным forEach в Stream API (я так понял, вам нужно с помощью него решить задачу, так как с помощью обычного for loop это решается примитивно). Единственная загвоздка тут это строка final int[] i = {0}; В лямбда выражениях мы можем использовать только final переменные или эквивалентные final переменные. Поэтому я создаю массив из единственного элемента, и с помощью него итерируюсь в лямбда выражении. Так как обычную final int i=0 Java мне не позволит итерировать (она же final).