使用流计算二维数组中特定字符的数量

8

我想使用流来计算二维数组中某个字符(例如空格:' ')的出现次数。我正在尝试找到解决方案。这是我的代码,使用了嵌套循环:

public int countFreeSpaces() {
    int freeSpaces = 0;
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            if (board[j][i] == ' ') freeSpaces++;
        }
    }
    return freeSpaces;
}

你能发一下你使用流尝试的代码吗? - lucasvw
1
board是什么类型的数组? - Cardinal System
3
可能是Java中二维数组的流问题重复 - Kh.Taheri
是的,我尝试将其实现到我的程序中,但无法这样做,因为我有一个字符数组。 - cerbin
@CardinalSystem 字符数组 - cerbin
1
这是关于字符数组的内容:https://dev59.com/Il8d5IYBdhLWcg3w41nz - Kh.Taheri
2个回答

9

我认为这个答案更具有表现力:

int freeSpaces = (int) Arrays.stream(board)
                             .map(CharBuffer::wrap)
                             .flatMapToInt(CharBuffer::chars)
                             .filter(i -> i == ' ')
                             .count();

6
不错的方法,但我会使用 Arrays.stream 来流式传输现有数组,而不是可变参数方法 Stream.of。另外,String::new 意味着复制 char[] 数据,所以我会使用 .map(CharBuffer::wrap) .flatMapToInt(CharSequence::chars)。与我们预期的相反,在Java 8中,CharBuffer.chars() 的实现甚至比 String.chars() 更有效率。 - Holger
2
首先,点个赞。由于我写下了答案,但不知道 OP 是否使用 char[] 还是 Character[],所以我使用了 IntStream。正如你所看到的,我的答案发布时间早于 OP 表示其类型为 char[] 的时间。 - holi-java
1
@Holger非常感谢您的见解!我会修改答案。 - Jacob G.

2

这个怎么样?

//                      v--- create a Stream<char[]>             
int spaces = (int) Stream.of(board)
                          .flatMapToInt(cells->IntStream.range(0, cells.length)
                          .filter(i -> cells[i] == ' '))
                          .count();

:),为什么不对?我不明白。有人能告诉我为什么吗?谢谢。我不擅长英语。 - holi-java
那很好,本来以为会更短,但易于阅读。 - cerbin
@cerbin 如果你移除注释和内联,你会发现代码会更短更有表现力。 - holi-java
没问题,缩进可以增加可读性。然而我认为你所做的这些注释并不必要,像 count() 这样的 Java 单词已经足够说明了。 - cerbin
@cerbin 好的。我稍后会删除评论。 - holi-java

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接