Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算字符串中字符出现次数的简单方法_Java_String - Fatal编程技术网

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

Java 计算字符串中字符出现次数的简单方法,java,string,Java,String,有没有一种简单的方法(而不是手动遍历所有字符串,或循环indexOf)来确定一个字符在字符串中出现了多少次 假设我们有“abdsd3$asda$asasadd$sadas”,我们希望$出现3次。遍历字符串可能是最有效的,尽管使用正则表达式这样做可能会产生更干净的代码(尽管您可以始终在函数中隐藏遍历代码)。public int countChar(string str,char c) { 整数计数=0; 对于(int i=0;i3. counts.get('a');//=>7. counts.ge

有没有一种简单的方法(而不是手动遍历所有字符串,或循环indexOf)来确定一个字符在字符串中出现了多少次


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

遍历字符串可能是最有效的,尽管使用正则表达式这样做可能会产生更干净的代码(尽管您可以始终在函数中隐藏遍历代码)。

public int countChar(string str,char c)
{
整数计数=0;
对于(int i=0;i

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

字符频率计数对于某些应用程序(如教育)来说是一项常见任务,但不够通用,无法保证包含在核心Java API中。因此,您可能需要编写自己的函数。

这方面有很多不同的实用程序,例如

但最后,它必须在字符串上循环,以这样或那样的方式计算出现的次数

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

公共静态int countMatches(字符串str、字符串sub)

此信息的来源是(来自):


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

你可以看一下对字符串的排序——把它当作一个字符数组——然后做一个修改过的二进制搜索来统计出现的次数?但我同意@tofutim的观点,遍历它是最有效的——O(N)与O(N*logN)+O(logN)

不是最佳的,而是计算发生次数的简单方法:

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

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

由于您无论如何都要扫描整个字符串,因此您可以建立完整的字符计数并进行任意数量的查找,所有这些都需要相同的大开销(n):

公共静态映射getCharFreq(字符串s){
Map charFreq=new HashMap();
如果(s!=null){
for(字符c:s.toCharArray()){
整数计数=charFreq.get(c);
int newCount=(count==null?1:count+1);
charFreq.put(c,newCount);
}
}
返回charFreq;
}
// ...
字符串s=“abdsd3$asda$asadd$sadas”;
映射计数=getCharFreq(s);
计数。获取(“$”);//=>3.
counts.get('a');//=>7.
counts.get('s');//=>6.

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

String s = ...;
int countDollar = s.length()-s.replaceAll("\\$","").length();
int counta = s.length()-s.replaceAll("a","").length();
一个更好的答案是这里的一个

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

"abdsd3$asda$asasdd$sadas".replaceAll( "[^$]*($)?", "$1" ).length();
请记住,这些要求是:

而不是手动遍历所有字符串,或索引的循环


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

你也可以为每个循环使用一个。我认为它更容易阅读

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

更具功能性的东西,没有正则表达式:

public static int count(String s, char c) {
    return s.length()==0 ? 0 : (s.charAt(0)==c ? 1 : 0) + count(s.substring(1),c);
}
为了清晰起见,它不是尾部递归。

函数式风格(Java 8,只是为了好玩):


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

还有另一种方法可以计算每个字符串中的字符数。 假设我们有一个字符串作为
String str=“abfdvdfv”

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

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);
    }
}
for(int i=0;i
然后,我们可以通过如下方式遍历映射来检查输出

for (Map.Entry<String, Integer> entry:map.entrySet()) 
{
    System.out.println(entry.getKey()+" count is : "+entry.getValue())

}
for(Map.Entry:Map.entrySet())
{
System.out.println(entry.getKey()+”计数为:“+entry.getValue())
}

这是可行的,但它令人困惑且过于复杂。当迭代可以简单而干净地使用时,为什么要使用递归——更不用说这种复杂的实现了?另外,
indexOf
查找目标字符串最左边的索引,因此
countChars(input.substring(0,input.indexOf(find)),find)
将始终等于零;您可以废弃返回表达式的第一行并得到相同的结果。Regex=cleaner?也许更短,但我要说的是,与基本循环代码相比,正则表达式通常都相当神秘(而且不那么干净)!我被选上了!我的第一篇帖子:-D@Marcelo解决方案看起来不错,但失败的原因是:
“$$$$”。拆分(\\$)。长度-1
which=-1或
“$$”。拆分($”)。长度-1
which=0。这几乎是个好主意。不过,在一些简单的情况下,这是行不通的。e、 g.s=“$”不起作用,因为$是正则表达式元字符。我更正了答案中的元字符问题。这仍然不适用于尾随“$”s,例如“abdsd3$asda$asadd$sadas$”,因为默认情况下忽略空的尾随项。它应该是
int counter=s.split(\$”,-1)
“\$”
应替换为
“\\$”
,因为反斜杠已经具有字符串本身特有的特殊含义,例如换行符、制表符等(转义字符),因此需要双反斜杠。噢,你不介意使用增强的for循环而不是C风格的遍历索引吗?我不想使用隐式迭代器。首先,当然,使用迭代器没有什么丢脸的,有什么问题吗?其次,迭代器不用于循环数组,例如,请参见。@DmitryGinzburg:问题是我们没有字符数组h
int occurrences = 0;
for(char c : yourString.toCharArray()){
   if(c == '$'){
      occurrences++;
   }
}
public static int count(String s, char c) {
    return s.length()==0 ? 0 : (s.charAt(0)==c ? 1 : 0) + count(s.substring(1),c);
}
str.chars().filter(num -> num == '$').count()
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);
    }
}
for (Map.Entry<String, Integer> entry:map.entrySet()) 
{
    System.out.println(entry.getKey()+" count is : "+entry.getValue())

}