regex 为什么while(matcher.find())进入无限循环?我在Streams中使用了它

gab6jxml  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(339)

我想要的:["Einstein","ist","kein","Stein"] ⇒ {" Einstein "= 2," kein "= 1," Stein "= 1}使用流我想将一个字符串列表转换为一个Map,找到所有" ei "示例。
我的代码陷入无限循环:

public static void main(String[] args) {
  List<String> L5 = List.of("Einstein", "ist", "kein", "Stein");
  Pattern P = Pattern.compile("[Ee]i");
  Map<String, Integer> result = L5.stream().filter(S -> P.matcher(S).find()).collect(
    Collectors.toMap(i -> i, i -> {
      int count = 0;
      while (P.matcher(i).find()) {
        count++;
      }
      return count;
    })
  );
  System.out.println(result);
}

我想计算Map中"ei"的示例数(特别是使用流)

z4iuyo4d

z4iuyo4d1#

问题出在while (P.matcher(i).find())行,每次while循环检查条件时,都会调用P.matcher(i),并创建一个新的匹配器示例来调用find(),当然每次都返回true,因此它变成了无限循环。
要解决这个问题,首先将P.matcher(i)赋给一个变量,这样就可以在同一个Matcher示例上调用find()

...
Matcher matcher = P.matcher(i);
while (true) {
    if (!matcher.find()) break;
    count++;
}
return count;
...

一个改进是我们可以使用Matcher.results()来获得计数,如下所示:

Matcher matcher = P.matcher(i);
return (int) matcher.results().count();

相关问题