【问题标题】:Counting specific characters in two dimensional array using stream使用流计算二维数组中的特定字符
【发布时间】:2017-12-18 09:15:39
【问题描述】:

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

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;
}

【问题讨论】:

标签: java arrays java-8 java-stream


【解决方案1】:

这个怎么样?

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

【讨论】:

  • :),为什么错了?我不明白。在我删除答案之前,谁能告诉我为什么?谢谢。我英语不好。
  • 效果很好,期待它会更短,但很容易阅读。
  • @cerbin 如果你去掉 cmets 和 inline,你会发现它会更短,更有表现力。
  • 很好,这些缩进增加了可读性。但是,在我看来,您制作的这些 cmets 不是必需的,像 count() 这样的 java 语言就足够了。
  • @cerbin 好的。稍后我将删除 cmets。
【解决方案2】:

我相信这个答案更具表现力:

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

【讨论】:

  • 好方法,虽然我会使用Arrays.stream 来流式传输现有数组,而不是可变参数方法Stream.of。另外,String::new 意味着复制 char[] 数据,所以我会使用 .map(CharBuffer::wrap) .flatMapToInt(CharSequence::chars) 代替。与我们预期的相反,在 Java 8 中,CharBuffer.chars() 的实现甚至比 String.chars() 更高效。
  • 首先,投票。由于我写下了答案,我不知道OP是使用char[]还是Character[],所以我改用IntStream。如您所见,我的答案发布时间是在 OP 说其类型为 char[] 之前。
  • @Holger 非常感谢您的洞察力!我会改变答案。
猜你喜欢
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 2015-11-14
相关资源
最近更新 更多