是否有一种简单的方法(而不是手动遍历所有字符串,或循环遍历indexOf)以便查找字符出现在字符串中的次数?
假设我们有“abdsd3 $ asda $ asasdd $ sadas”,我们希望$出现3次。
答案 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;
注意:的
答案 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();
中有一个更好的答案
答案 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;
}
}