【问题标题】:Count occurences in a row of a char in string [closed]计算字符串中连续字符的出现次数[关闭]
【发布时间】:2021-01-27 22:20:30
【问题描述】:

有什么方法可以在 Java 中连续计算字符串中字符的出现次数? 例如,给定字符串:ABBB99999SHJ99JI,将输出在字符串中找到 9 字符一次:连续 5 次和两次:连续 2 次。 我试图找到解决方案,但没有结果。

可以使用正则表达式找到它,但是对于每个数量的数字,我需要创建一个单独的数字。

【问题讨论】:

  • 您可以遍历 String 的字符并计算它们的出现次数。
  • @deHaar 我不想找到这些事件。我想计算一排发生了多少次
  • 我认为最简单的方法是使用 for 循环并计算出现次数
  • @Nosrep,我可以计算出现次数。我需要连续计算。我的意思是,您有字符串 ABBBSB,然后搜索 B。然后输出将是“一次,连续 3 次,一次,连续 1 次”
  • 即使循环可以工作,您也可能需要两个嵌套循环。

标签: java string char


【解决方案1】:

可以使用你提到的正则表达式来完成:

  • 创建一个正则表达式来查找包含至少一个字符的组,例如([9]+)
  • 循环查找组并收集它们的长度。
public static List<Integer> countGroupLengths(String src, char c) {

    Pattern p = Pattern.compile(c + "+"); // e.g. `9+` works too
    Matcher m = p.matcher(src);
    List<Integer> result = new ArrayList<>();
    while (m.find()) {
        String group = m.group(1);
        result.add(group.length());
    }
    return result;
}

测试:

System.out.println(countGroupLengths("ABBB99999SHJ99JI", '9'));

输出:

[5, 2]

更新
为每个字符构建到长度列表的映射可能是值得的 在 cmets 中集成 @Andreas 提供的所有更改:

public static Map<Character, List<Integer>> buildMapOfGroups(String src) {

    return src.chars()     // IntStream
              .mapToObj(c -> (char) c)
              .map(c -> Map.entry(
                      c, // key
                      Pattern.compile(c + "+").matcher(src)
                             .results()
                             .map(r -> r.group().length())
                             .collect(Collectors.toList())
              ))
              .collect(Collectors.toMap(
                  Map.Entry::getKey, Map.Entry::getValue, 
                  (e1, e2) -> e1, LinkedHashMap::new));
}

对于给定的来源:System.out.println(buildMapOfGroups("ABBB99999SHJ99JI")); 打印:

{A=[1], B=[3], 9=[5, 2], S=[1], H=[1], J=[1, 1], I=[1]}

注意:使用 LinkedHashMap 保持插入顺序

【讨论】:

  • 非常感谢!这就是我搜索的内容。
  • ([9]+) 过多。使用9+,然后将group(1)替换为group()group(0),就可以了。
  • 仅供参考:在Java 9+中,该方法可以写成return Pattern.compile(c + "+").matcher(src).results().map(r -&gt; r.group().length()).collect(Collectors.toList());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
相关资源
最近更新 更多