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

时间:2011-05-23 17:30:50

标签: java string

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

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

15 个答案:

答案 0 :(得分:104)

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

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

答案 1 :(得分:48)

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

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

答案 2 :(得分:31)

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

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

注意:

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

答案 3 :(得分:23)

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

答案 4 :(得分: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

答案 5 :(得分:5)

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

答案 6 :(得分:4)

我相信你期望得到的“一个班轮”就是:

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

请记住,要求是:

  

而不是手动遍历所有字符串,或循环for indexOf

让我补充一点:这个问题的核心听起来似乎不需要“任何循环”,也没有速度要求。我相信这个问题的潜台词是冷静因子

答案 7 :(得分:4)

你也可以为每个循环使用a。我觉得阅读起来比较简单。

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

答案 8 :(得分:4)

在没有正则表达式的情况下,功能更强一些:

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

为了清楚起见,它不是尾递归的。

答案 9 :(得分:3)

遍历字符串可能是最有效的,但使用Regex执行此操作可能会产生更清晰的代码(尽管您始终可以在函数中隐藏遍历代码)。

答案 10 :(得分:3)

有很多不同的实用工具,例如Apache Commons Lang String Utils

但最后,它必须遍历字符串以便以某种方式计算事件。

另请注意,上面的countMatches方法具有以下签名,因此也适用于子字符串。

public static int countMatches(String str, String sub)

此源是(来自here):

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

我很好奇他们是在迭代字符串还是使用正则表达式。

答案 11 :(得分:2)

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

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

duplicate question

中有一个更好的答案

答案 12 :(得分:0)

您可以查看对字符串进行排序 - 将其视为char数组 - 然后执行修改后的二进制搜索来计算出现次数?但我同意@tofutim认为,遍历它是最有效的 - O(N)与O(N * logN)+ O(logN)

答案 13 :(得分:0)

还有另一种计算每个字符串中字符数的方法。 假设我们有一个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())

}

答案 14 :(得分:-1)

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

        }