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

有没有一个简单的方法(而不是手动遍历所有的string,或循环的indexOf),以查找多less次,一个字符出现在一个string?

假设我们有“abdsd3 $ asda $ asasdd $ sadas”,我们希望$出现3次。

String s = "..."; int counter = 0; for( int i=0; i<s.length(); i++ ) { if( s.charAt(i) == '$' ) { counter++; } } 

这绝对是最快的方法。 正则expression式在这里慢得多,可能更难理解。

不是最佳的,但是简单的方法来计数事件:

 String s = "..."; int counter = s.split("\\$", -1).length - 1; 

注意:

  • 美元符号是一个特殊的正则expression符号,所以它必须用反斜杠转义。
  • 反斜线是换行符(如换行符)的特殊符号,因此必须用反斜杠进行转义。
  • split的第二个参数可防止删除空的尾随string。

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

 str.chars().filter(num -> num == '$').count() 

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

既然你正在扫描整个string,你可以build立一个完整的字符数,并做任何数量的查找,所有的相同的大哦成本(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 

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

遍历string可能是最有效的,虽然使用正则expression式来做到这一点可能会产生更清晰的代码(尽pipe你总是可以隐藏你的遍历代码在一个函数中)。

那么这里有一堆不同的工具,例如Apache Commons Lang String Utils

但是最后,它必须遍历string来统计事件的发生。

还请注意,上面的countMatches方法有以下签名,所以也适用于子string。

public static int countMatches(String str, String sub)

这个来源是(从这里 ):

 public static int countMatches(String str, String sub) { if (isEmpty(str) || isEmpty(sub)) { return 0; } int count = 0; int idx = 0; while ((idx = str.indexOf(sub, idx)) != -1) { count++; idx += sub.length(); } return count; } 

我很好奇,如果他们迭代string或使用正则expression式。

你也可以为每个循环使用一个。 我认为阅读比较简单。

 int occurrences = 0; for(char c : yourString.toCharArray()){ if(c == '$'){ occurrences++; } } 

我相信你期望得到的“一线”是这样的:

 "abdsd3$asda$asasdd$sadas".replaceAll( "[^$]*($)?", "$1" ).length(); 

请记住,要求是:

而不是手动遍历所有的string ,或者indexOf的循环

让我补充一句:在这个问题的核心,这听起来像“任何循环”是不想要的,没有速度的要求。 我相信这个问题的潜台词是冷酷因素

更多的function,没有正则expression式:

 public static int count(String s, char c) { return s.length()==0 ? 0 : (s.charAt(0)==c ? 1 : 0) + count(s.substring(1),c); } 

为了清楚起见,它没有尾recursion。

您可以看看对string进行sorting – 将其视为字符数组 – 然后执行修改的二进制search来计算出现次数? 但是我同意@tofutim遍历它是最高效的 – O(N)对O(N * logN)+ O(logN)

这是简单的代码,但当然慢一点。

 String s = ...; int countDollar = s.length()-s.replaceAll("\\$","").length(); int counta = s.length()-s.replaceAll("a","").length(); 

更好的答案在这里是一个重复的问题

还有另一种方法来计算每个string中的字符数。 假设我们有一个string作为String str = "abfdvdvdfv"

然后,我们可以通过遍历一次来计算每个字符出现的次数

 for (int i = 0; i < str.length(); i++) { if(null==map.get(str.charAt(i)+"")) { map.put(str.charAt(i)+"", new Integer(1)); } else { Integer count = map.get(str.charAt(i)+""); map.put(str.charAt(i)+"", count+1); } } 

然后我们可以通过遍历Map来检查输出

 for (Map.Entry<String, Integer> entry:map.entrySet()) { System.out.println(entry.getKey()+" count is : "+entry.getValue()) } 
  public static int countChars(String input,char find){ if(input.indexOf(find) != -1){ return countChars(input.substring(0, input.indexOf(find)), find)+ countChars(input.substring(input.indexOf(find)+1),find) + 1; } else { return 0; } }