查找Java字符串中出现的字符

我想计算字符串中字符的出现次数,假设我有字符串“aaaab”,我如何计算其中的数量?

如果不使用正则表达式,代码看起来更容易阅读。

 int count = 0; for(int i =0; i < string.length(); i++) if(string.charAt(i) == 'a') count++; 

count现在包含字符串中'a'的数量。 并且,这在最佳时间执行。

正则表达式很适合模式匹配。 但只是一个常规循环将在这里完成工作。

Guava的CharMatcher API非常强大和简洁:

 CharMatcher.is('a').countIn("aaaab"); //returns 4 
 String string = "aaab"; int count = string.length() - string.replaceAll("a", "").length(); 

而不是“a”使用像“[a-zA-Z]”这样的正则表达式来计算所有单词字符

尝试使用Apache Commons的StringUtils :

 int count = StringUtils.countMatches("aaaab", "a"); // count = 4 
 int count = 0; for (char c : string.toCharArray()) if (c == 'a') 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; } 

这是一个非常短的解决方案,没有任何额外的库:

 String input = "aaaab"; int i = -1, count = 0; while( (i = input.indexOf( 'a', i + 1 ) ) != -1 ) count++; System.out.println( 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); 

正则表达式在计算简单事物方面不是特别好。 想想ant+大锤。 他们擅长将复杂的弦乐组合成碎片。

无论如何,这是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具有状态信息,可以让它向下爬行应用Pattern的字符串。

循环基本上说,“匹配器,爬下字符串,找到我下一次出现的模式。如果我们找到它,增加计数器。” 请注意,Matcher找到的字符序列不仅仅是’a’。 它找到如下的序列:’a’,’bbba’,’bba’,’ba’等。也就是说,除了最后一个字符外,不包含’a’的字符串。

 public static void main(String[] args) { Map data = new HashMap(); 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()); } } 

你可以简单地使用这个:

 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 
 String s1="parasanna"; StringBuffer sb=new StringBuffer(); boolean print = false; for (int i=0; i 

这是我的逻辑……

 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 

您可以使用apache commons提供的StringUtils类。 StringUtils.countMatches(String originalString,String subCharacterSequesnce)

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