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

时间:2010-09-21 19:58:52

标签: java regex

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

16 个答案:

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

    }