我想要统计一个字符串中某个字符出现的次数,例如我有字符串 "aaaab",我该如何计算其中字母"a"的数量?
String string = "aaab";
int count = string.length() - string.replaceAll("a", "").length();
使用正则表达式如"[a-zA-Z]"来计算所有单词字符,而不是使用"a"
尝试使用Apache Commons的StringUtils:
int count = StringUtils.countMatches("aaaab", "a");
// count = 4
如果你不使用正则表达式,代码看起来会更容易阅读。
int count = 0;
for(int i =0; i < string.length(); i++)
if(string.charAt(i) == 'a')
count++;
count
现在包含您字符串中 'a' 的数量。而且,这种方法的执行时间是最优的。
正则表达式适用于模式匹配,但在这里使用普通循环即可完成任务。
正则表达式并不擅长计算简单的事情。可以想象成用大锤去捣蚂蚁。但是它们擅长将复杂的字符串拆分成几个部分。
无论如何,这里有一个解决方案,OP感兴趣的是使用正则表达式来计算'a'的数量:
public class Reggie {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("[^a]*a");
Matcher matcher = pattern.matcher("aaabbbaaabbabababaaabbbbba");
int count = 0;
while(matcher.find()) {
count++;
}
System.out.println(count+" matches");
}
}
[^a]*a
这个[^a]*
意味着“匹配零个或多个非“a”字符”。这使我们能够从字符串开头吞噬非“a”垃圾:如果输入是“bbba”,则[^a]*
将匹配“bbb”,而不是匹配“a”。不要担心,正则表达式中的尾随“a”表示“匹配一个'a'”。因此,我们的正则表达式是:“匹配零个或多个非'a'字符,后跟一个'a'。”int count = 0;
for (char c : string.toCharArray())
if (c == 'a')
count++;
String searchFor = "a";
String base = "aaaab";
int count=0;
int index =base.indexOf(searchFor);
while(index!=-1){
++count;
index = base.indexOf(searchFor, index+searchFor.length());
}
System.out.println(count);
public int countChars(char c, String s) {
int result = 0;
for (int i = 0, n = s.length(); i < n; i++) {
if (s.charAt(i) == c) {
result++;
}
}
return result;
}
i < s.length()
从for (int i = 0; i < s.length(); i++)
中移出来:通常没有必要通过这样的“优化”使代码更难阅读。这是一篇关于“聪明”的编程技巧的好文章:写愚蠢的代码 - 四位领先的Java开发者的建议 - Bart Kiersfor (int i = 0; i < expensiveCalculation(); i++)...
是否真的很昂贵和/或常量和/或可以提升出循环。 - dty以下是一种不需要任何额外库的非常简短的解决方案:
String input = "aaaab";
int i = -1, count = 0;
while( (i = input.indexOf( 'a', i + 1 ) ) != -1 ) count++;
System.out.println( count );
public static void main(String[] args) {
Map<Character, Integer> data = new HashMap<Character, Integer>();
String s = "aaaab";
char[] chars = s.toCharArray();
for (char a : chars) {
if (data.containsKey(a)) {
int value = data.get(a);
data.put(a, value + 1);
} else {
data.put(a, 1);
}
}
Iterator it = data.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry) it.next();
System.out.println(pairs.getKey() + " = " + pairs.getValue());
}
}
regex
标签。记住,有些人面对问题会想:“嘿,我来用正则表达式解决!”现在他们有两个问题了。 - Greg Hewgill