Найти вхождения символов в строке Java

Я хотел бы подсчитать появление символа в строке, предположим, что у меня есть строка "aaaab", как бы я подсчитал количество a в ней?

Ответ 1

Код выглядит проще, если вы не используете регулярные выражения.

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

count теперь содержит число 'a в вашей строке. И это выполняется в оптимальное время.

Регулярные выражения хороши для сопоставления шаблонов. Но просто регулярный цикл выполнит эту работу здесь.

Ответ 2

Guava CharMatcher API достаточно мощный и лаконичный:

CharMatcher.is('a').countIn("aaaab"); //returns 4

Ответ 3

String string = "aaab";
int count = string.length() - string.replaceAll("a", "").length();

вместо "a" используйте регулярное выражение типа "[a-zA-Z]" для подсчета всех словных символов

Ответ 5

int count = 0;
for (char c : string.toCharArray()) 
    if (c == 'a')
        count++;

Ответ 6

Простой цикл над символами сделает это.

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

Вот очень короткое решение без каких-либо дополнительных библиотек:

String input = "aaaab";

int i = -1, count = 0;
while( (i = input.indexOf( 'a', i + 1 ) ) != -1 ) count++;

System.out.println( count );

Ответ 8

Регулярные выражения не особенно хороши для подсчета простых вещей. Подумайте ant + кувалдой. Они хорошо разбирают сложные струны на куски.

В любом случае, здесь есть одно решение, которое интересует OP - с помощью регулярного выражения для подсчета 'a's:

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]* означает "совместить ноль или более не-а" символов. Это позволяет нам поглощать не-'' crud с начала строки: если вход является "bbba", тогда [^a]* будет соответствовать "bbb". Он не соответствует "а". Чтобы не волноваться, конечный "а" в регулярном выражении говорит: "Совместите точно один" а ". Поэтому наше регулярное выражение говорит:" сопоставляйте ноль или более не-а" символов, за которыми следует "a".

Ok. Теперь вы можете прочитать о Pattern и Matcher. В двух словах показано, что шаблон является скомпилированным регулярным выражением. Очень сложно скомпилировать регулярное выражение, поэтому я делаю мой статический, так что они только компилируются один раз. Матчи - это класс, который применит строку к шаблону, чтобы увидеть, соответствует ли она. Matcher имеет информацию о состоянии, которая позволяет ему сканировать строку, применяя шаблон повторно.

В цикле в основном говорится: "Соединитель, сканируйте строку, найдя мне следующее появление шаблона. Если мы найдем его, увеличьте счетчик". Обратите внимание, что последовательности символов, найденные с помощью Matcher, не просто "a". Он находит последовательности, подобные следующим: "a", "bbba", "bba", "ba" и т.д. То есть строки, которые не содержат "a", за исключением их последнего символа.

Ответ 9

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

Ответ 10

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

Ответ 11

Вы можете просто использовать это:

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

}

Ответ 12

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

}

Ответ 13

Вот моя логика...

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

Ответ 14

Вы можете использовать класс StringUtils, предоставляемый apache commons. StringUtils.countMatches(String originalString, String subCharacterSequesnce)

Ответ 15

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

Ответ 16

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

    }