我想计算字符串中字符的出现次数,假设我有字符串“aaaab”,我如何计算其中的字符数量?
答案 0 :(得分:23)
Guava的CharMatcher API非常强大而简洁:
CharMatcher.is('a').countIn("aaaab"); //returns 4
答案 1 :(得分:21)
String string = "aaab";
int count = string.length() - string.replaceAll("a", "").length();
而不是“a”使用像“[a-zA-Z]”这样的正则表达式来计算所有单词字符
答案 2 :(得分:15)
尝试使用Apache Commons' StringUtils:
int count = StringUtils.countMatches("aaaab", "a");
// count = 4
答案 3 :(得分:13)
如果不使用正则表达式,代码看起来更容易阅读。
int count = 0;
for(int i =0; i < string.length(); i++)
if(string.charAt(i) == 'a')
count++;
count
现在包含字符串中的'a'。并且,这在最佳时间内执行。
正则表达式很适合模式匹配。但只需一个常规循环即可完成工作。
答案 4 :(得分:4)
int count = 0;
for (char c : string.toCharArray())
if (c == 'a')
count++;
答案 5 :(得分:4)
正则表达式在计算简单事物方面并不是特别擅长。想想蚂蚁+大锤。他们擅长将复杂的弦乐组合成碎片。
无论如何,这是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'crud:如果输入是'bbba',那么[^a]*
将匹配'bbb'。它与'a'不匹配。不用担心,正则表达式中的尾随'a'表示“恰好匹配一个'a'”。所以我们的正则表达式说,“匹配零个或多个非'''字符后跟一个'a'。”
确定。现在您可以阅读有关模式和匹配器的信息。简而言之,Pattern是一个编译的正则表达式。编译正则表达式是昂贵的,所以我使我的静态,所以他们只编译一次。 Matcher是一个将字符串应用于Pattern以查看它是否匹配的类。 Matcher具有状态信息,可以让它向下爬行应用Pattern的字符串。
循环基本上说,“匹配器,向下爬行,找到我下一次出现的模式。如果找到它,就增加计数器。”请注意,Matcher找到的字符序列不仅仅是'a'。它正在查找如下序列:'a','bbba','bba','ba'等。也就是说,除了最后一个字符外,不包含'a'的字符串。
答案 6 :(得分:3)
对字符进行简单的循环即可。
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;
}
答案 7 :(得分:3)
这是一个非常简短的解决方案,没有任何额外的库:
String input = "aaaab";
int i = -1, count = 0;
while( (i = input.indexOf( 'a', i + 1 ) ) != -1 ) count++;
System.out.println( count );
答案 8 :(得分:3)
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);
答案 9 :(得分:2)
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());
}
}
答案 10 :(得分:1)
你可以简单地使用它:
String a = "i am here as junior java programmer";
Set temp = new HashSet();
char[] chararray=a.toCharArray();
Set temp=new HashSet();
for(int i=0;i<chararray.length;i++)
{
int count=0;
for (int j=0;j<chararray.length;j++) {
if (chararray[i]==chararray[j]) {
count++;
}
}
if (temp.add(chararray[i])!=false)
System.out.println("Character "+chararray[i]+" occur "+count);
}
答案 11 :(得分:1)
String s1="parasanna";
StringBuffer sb=new StringBuffer();
boolean print = false;
for (int i=0; i<s1.length(); i++){
int count=1;
char c=s1.charAt(i);
sb.append(c);
for (int j=1; j<sb.length(); j++) {
char c2=sb.charAt(j-1);
if (c==c2) {
count++;
}
}
System.out.println(c+"=="+count);
}
答案 12 :(得分:1)
这是我的逻辑......
public class OccurenceOf_Character {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println(" Enter a string");
String str = input.nextLine();
System.out.println(" Enter a character");
String character=input.next();
int l = character.length();
char c=character.charAt(0);
int count=0;
for(int i=0;i<str.length();i++)
{
if(str.charAt(i) == c)
{
count=count+1;
}
}
System.out.println(count);
}
}
答案 13 :(得分:1)
您可以使用apache commons提供的StringUtils类。 StringUtils.countMatches(String originalString,String subCharacterSequesnce)
答案 14 :(得分:1)
Java 8
方法1 - 获取单个字符的出现次数
String sentence = "Aaron ate apples upon a rock";
long counted = IntStream.range(0, sentence.length())
.filter(i->sentence.charAt(i) == 'a')
.count();
System.out.println("First approach: " + counted);
方法2 - 允许指定字符
String sentence = "Aaron ate apples upon a rock";
BiFunction<String, Character, Long> counter = (s,c) -> {
return IntStream.range(0, s.length())
.filter(i->s.charAt(i) == c)
.count();
};
System.out.println("Second approach (with 'a'): " + counter.apply(sentence, 'a'));
System.out.println("Second approach (with 'o'): " + counter.apply(sentence, 'o'));
方法3 - 计算所有字符的出现次数
String sentence = "Aaron ate apples upon a rock";
Map<Character, Long> counts = IntStream.range(0, sentence.length())
.mapToObj(i->sentence.charAt(i))
.collect(Collectors.groupingBy(o->o, Collectors.counting()));
System.out.println("Third approach for every character... ");
counts.keySet().stream()
.forEach(key -> System.out.println("'" + key + "'->" + counts.get(key)));
答案 15 :(得分:0)
public static void main(String[] args) throws IOException
{
//String s1="parasanna";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("enter string:");
String s1 = br.readLine();
StringBuffer sb=new StringBuffer(s1);
while(sb.length() != 0)
{
char c = sb.charAt(0);
int cnt = 0;
for(int i=0; i< sb.length(); i++)
{
if(c == sb.charAt(i))
{
cnt++;
sb.deleteCharAt(i);
i--;
}
}
System.out.println(c + " occurance is:" + cnt);
}
}