Форматирование массива 2d int в строку с использованием потоков - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть следующий массив:

private static final int[][] BOARD = {
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 }
};

И я хочу создать строковое представление для него, поэтому, если бы я должен был напечатать его на консоли, он должен выглядеть следующим образом:

[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]

Я могу сделать это с помощью 2 вложенных циклов for, но я пытаюсь сделать это с помощью потоков.Вот что я получил до сих пор:

public String toString() {
    StringJoiner board = new StringJoiner("\n");

    for (int i = 0; i < BOARD.length; i++) {
        board.add(
            IntStream.of(BOARD[i])
                .mapToObj(String::valueOf)
                .collect(Collectors.joining(",", "[", "]"))
        );
    }
    return board.toString();
}

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

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Collections 'toString() уже обеспечивает такую ​​запись в классе AbstractCollection .Просто используйте: -

Arrays.stream(BOARD)
        .forEach(ints -> System.out.println(
                Arrays.stream(ints).boxed().collect(Collectors.toList()))
        );

Или, если вы хотите изменить int[][] на Integer[][], вы можете даже сделать: -

Arrays.stream(BOARD)
        .forEach(ints -> System.out.println(Arrays.deepToString(ints)));
0 голосов
/ 14 ноября 2018

Вы можете вкладывать stream и отображать каждый уровень вместе сначала через запятую, а затем через системный разделитель строк.Мол,

return Arrays.stream(BOARD).map(a -> Arrays.stream(a)
            .mapToObj(String::valueOf).collect(Collectors.joining(",", "[", "]")))
            .collect(Collectors.joining(System.lineSeparator()));

Я получаю

[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
0 голосов
/ 14 ноября 2018

Вы также можете сделать это, используя Arrays.stream как:

Arrays.stream(BOARD)
        .map(aBOARD -> IntStream.of(aBOARD)
                .mapToObj(String::valueOf)
                .collect(Collectors.joining(",", "[", "]")))
        .forEach(board::add);
...