【发布时间】:2017-12-22 19:33:28
【问题描述】:
我有一个 2D IntArray 代表一个游戏板,其中 -1 表示一个空白区域,一些值大于或等于 0 表示该单元格属于某个玩家。如下所示(-1 由点(.)表示)
. . . . .
1 0 . . 2
0 . 1 3 3
4 3 . . 0
我想获得一个Set,其中包含已被任何玩家占据的单元格的位置。像这样的:
[Cell{1,0}, Cell{1,1}, ..., Cell{3,4}]
我知道第一种方法是遍历二维数组:
val set = HashSet<Cell>();
for(row in 0 until HEIGHT){
for (col in 0 until WIDTH){
if(board[row][col] >= 0)
set.add(Cell(row, col))
}
}
但是...如果我使用流,效率会更高吗?能否以更少的代码更高效地实现?
IntStream.range(0, HEIGHT)
.mapToObj { row -> IntStream.range(0, WIDTH)
.filter{ col -> board[row][col] >= 0}
.mapToObj { col -> Cell(row, col) } }
.flatMap { point -> point }
.collect(Collectors.toSet())
【问题讨论】:
标签: arrays kotlin java-stream