我有一个二维整数数组(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()将其转换为2D布尔数组。结果数组为:
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
您能告诉我我做错了什么以及如何解决吗?谢谢。
答案 0 :(得分:2)
您可以将结果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)
。
答案 1 :(得分:1)
如果结果需要一个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;
}
答案 2 :(得分:1)
您可以将逻辑简化为:
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;
}
}
注意 :这样可以避免每次迭代都临时创建数组,因此可以节省您更多的空间,并且可以预先以精确的边界初始化数组。