Este post discutirá como contar ocorrências de um determinado caractere em uma string em Java.
1. Solução ingênua
Também podemos escrever nossa própria rotina para essa tarefa simples. A ideia é iterar sobre caracteres na string usando um loop for e, para cada caractere encontrado, incremente o contador (começando em 0) se ele corresponder ao caractere fornecido.
1 2 3 4 5 6 7 8 9 10 11 |
private static int countOccurrences(String str, char ch) { int counter = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ch) { counter++; } } return counter; } |
2. Usando Java 8
Com Java 8, podemos usar Stream para contar ocorrências do caractere fornecido em uma string. Isso é demonstrado abaixo:
1 2 3 4 5 |
private static long countOccurrences(String str, char ch) { return str.chars() .filter(c -> c == ch) .count(); } |
3. Usando a Biblioteca Guava
Outra boa alternativa é usar a Guava CharMatcher classe.
1 2 3 |
private static int countOccurrences(String str, char ch) { return com.google.common.base.CharMatcher.is(ch).countIn(str); } |
4. Usando Apache Commons Lang
Também podemos fazer isso usando o countMatches
método do StringUtils
classe fornecida pela biblioteca Apache Commons.
1 2 3 |
private static int countOccurrences(String str, char ch) { return org.apache.commons.lang3.StringUtils.countMatches(str, String.valueOf(ch)); } |
5. Usando replace()
método
Aqui está outra solução que usa String's replace()
método para remover todas as ocorrências do caractere especificado da string e fazer uso do length()
propriedade da string para determinar a contagem, conforme mostrado abaixo:
1 2 3 |
private static int countOccurrences(String str, char ch) { return str.length() - str.replace(String.valueOf(ch), "").length(); } |
6. Usando Regex
Outra maneira plausível é usar expressões regulares junto com um contador.
1 2 3 4 5 6 7 8 9 10 11 12 |
private static int countOccurrences(String str, char ch) { Matcher matcher = Pattern.compile(String.valueOf(ch)) .matcher(str); int counter = 0; while (matcher.find()) { counter++; } return counter; } |
7. Usando o Mapa de Frequência
A complexidade de tempo de todas as soluções acima é pelo menos linear, pois estamos varrendo toda a string. Se o número total de pesquisas for maior, considere pré-processar a string uma vez e criar um mapa de frequência fora dele que armazena a contagem de cada caractere distinto presente na string. Agora, cada chamada de método subsequente terá a única linha constante.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import java.util.HashMap; import java.util.Map; class Main { private static Map<Character, Integer> constructFrequencyMap(char[] chars) { Map<Character, Integer> freq = new HashMap<>(); for (char ch: chars) { freq.put(ch, freq.getOrDefault(ch, 0) + 1); } return freq; } private static int countOccurrences(Map<Character, Integer> freq, char ch) { return freq.get(ch); } public static void main(String[] args) { String str = "ABAACBDD"; char ch = 'A'; Map<Character, Integer> freq = constructFrequencyMap(str.toCharArray()); System.out.println("Character " + ch + " occurs " + countOccurrences(freq, ch) + " times."); } } |
Isso é tudo sobre a contagem de ocorrências de um determinado caractere em uma String Java.