计算字符串中字符出现次数的简单方法

Geo*_*nis 63 java string

有没有一种简单的方法(而不是手动遍历所有的字符串,或循环遍历indexOf),以便找到一个字符出现在字符串中的次数?

假设我们有"abdsd3 $ asda $ asasdd $ sadas",我们希望$出现3次.

Dan*_*iel 109

public int countChar(String str, char c)
{
    int count = 0;

    for(int i=0; i < str.length(); i++)
    {    if(str.charAt(i) == c)
            count++;
    }

    return count;
}
Run Code Online (Sandbox Code Playgroud)

这绝对是最快的方式.这里的正则表达式要慢很多,而且可能更难理解.

  • 首先,使用迭代器肯定没有羞耻,问题是什么?其次,迭代器不用于循环数组,例如,请参阅http://stackoverflow.com/a/7956673/1828937. (2认同)

Dmi*_*urg 53

功能风格(Java 8,只是为了好玩):

str.chars().filter(num -> num == '$').count()
Run Code Online (Sandbox Code Playgroud)


Mar*_*elo 31

不是最佳的,但计算出现次数的简单方法:

String s = "...";
int counter = s.split("\\$", -1).length - 1;
Run Code Online (Sandbox Code Playgroud)

注意:

  • 美元符号是一个特殊的正则表达式符号,因此必须使用反斜杠进行转义.
  • 反斜杠是转义字符(如换行符)的特殊符号,因此必须使用反斜杠进行转义.
  • split的第二个参数可防止删除空尾随字符串.

  • 几乎是个好主意.但是在一些简单的情况下失败了.例如s ="$" (6认同)

the*_*sch 23

你可以使用Apache Commons ' StringUtils.countMatches(String string, String subStringToCount).


mae*_*ics 7

既然你正在扫描整个字符串,你可以建立一个完整的字符数并进行任意数量的查找,所有这些都是相同的大成本(n):

public static Map<Character,Integer> getCharFreq(String s) {
  Map<Character,Integer> charFreq = new HashMap<Character,Integer>();
  if (s != null) {
    for (Character c : s.toCharArray()) {
      Integer count = charFreq.get(c);
      int newCount = (count==null ? 1 : count+1);
      charFreq.put(c, newCount);
    }
  }
  return charFreq;
}

// ...
String s = "abdsd3$asda$asasdd$sadas";
Map counts = getCharFreq(s);
counts.get('$'); // => 3
counts.get('a'); // => 7
counts.get('s'); // => 6
Run Code Online (Sandbox Code Playgroud)


mae*_*ics 5

字符频率计数是某些应用程序(例如教育)的常见任务,但不足以保证包含在核心Java API中.因此,您可能需要编写自己的函数.