Как преобразовать двумерный массив целых чисел в двумерный массив логических значений, используя потоки в Java? - PullRequest
0 голосов
/ 09 января 2019

У меня есть двумерный массив целых чисел (0 или 1), например ...

int [][] gridInt = {
        {0, 0, 0, 1, 0, 0},
        {0, 0, 1, 1, 0, 0},
        {1, 0, 1, 0, 0, 1},
        {0, 0, 0, 0, 1, 0},
        {0, 1, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0}
    };

и я хочу преобразовать его в двумерный массив логических выражений, используя потоки Java и .map (). В результате получается массив:

boolean[][] gridBool = {
        {false, false, false, true, false, false},
        {false, false, true, true, false, false},
        {true, false, true, false, false, true},
        {false, false, false, false, true, false},
        {false, true, false, false, false, false},
        {false, false, false, false, false, false}
    };

Моя последняя попытка была:

boolean[][] gridBool = Arrays.stream(gridInt)
    .map(row -> Arrays.stream(row)
        .mapToObj(i -> i == 1)
        .toArray(Boolean[]::new)
    )
    .toArray(Boolean[][]::new);

Но мой код не компилируется, сообщение об ошибке:

error: incompatible types: inferred type does not conform to upper bound(s)
        .toArray(Boolean[][]::new);
                ^
inferred: Boolean[]
upper bound(s): boolean[],Object

Не могли бы вы сказать мне, что я делаю неправильно и как это исправить? Спасибо.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

если вам требуется Boolean[][] в результате, тогда это так же просто, как изменить тип приемника с boolean на Boolean:

Boolean[][] gridBool = Arrays.stream(gridInt)
                .map(row -> Arrays.stream(row)
                        .mapToObj(i -> i == 1)
                        .toArray(Boolean[]::new)
                )
                .toArray(Boolean[][]::new);

Однако, кажется, вы хотите boolean[][] в результате; к сожалению, поскольку BooleanStream не существует, было бы неразумно выполнять это через поток, поскольку удобочитаемость или краткость не являются лучшими, скорее императивный подход был бы лучше:

boolean[][] result = new boolean[gridInt.length][];
for (int i = 0; i < gridInt.length; i++) {
     boolean[] temp = new boolean[gridInt[i].length];
     for (int j = 0; j < gridInt[i].length; j++) 
          temp[j] = gridInt[i][j] == 1;         
     result[i] = temp;
}
0 голосов
/ 09 января 2019

Вы можете просто упростить логику как:

boolean[][] gridBool = new boolean[gridInt.length][gridInt[0].length]; // NxN grid
for (int i = 0; i < gridInt.length; i++) {
    for (int j = 0; j < gridInt[0].length; j++) {
        gridBool[i][j] = gridInt[i][j] != 0;
    }
}

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

0 голосов
/ 09 января 2019

Вы можете изменить полученный Array на Boolean:

Boolean[][] grid1bool = Arrays.stream(gridInt)
                .map(row -> Arrays.stream(row)
                    .mapToObj(i -> i == 1)  //Stream<Boolean>
                    .toArray(Boolean[]::new)
                )
                .toArray(Boolean[][]::new);

mapToObj требует Object, а не типа примитива boolean, поэтому мы не можем использовать toArray(boolean[][]::new).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...