1. Información general
Hay muchas formas de contar el número de apariciones de un carácter en una cadena en Java.
En este artículo rápido, nos centraremos en algunos ejemplos de cómo contar caracteres, primero, con la biblioteca central de Java y luego con otras bibliotecas y marcos como Spring y Guava.
2. Uso de Core Java Lib
2 .1. Enfoque imperativo
Algunos desarrolladores pueden preferir utilizar el núcleo de Java. Hay muchas formas de contar el número de apariciones de un carácter en una cadena.
Comencemos con un enfoque simple / ingenuo:
String someString = "elephant"; char someChar = 'e'; int count = 0; for (int i = 0; i < someString.length(); i++) { if (someString.charAt(i) == someChar) { count++; } } assertEquals(2, count);
No es sorprendente que esto funcione, pero tampoco es sorprendente que haya mejores formas de hacerlo.
2.2. Usando recursividad
Una solución menos obvia, pero aún interesante, es usar la recursividad:
private static int countOccurences( String someString, char searchedChar, int index) { if (index >= someString.length()) { return 0; } int count = someString.charAt(index) == searchedChar ? 1 : 0; return count + countOccurences( someString, searchedChar, index + 1); }
Podemos invocar este método recursivo de la siguiente manera: useRecursionToCountChars ("elefante", 'e', 0)
2.4. Usar expresiones regulares
Otra forma sería usar expresiones regulares:
Pattern pattern = Pattern.compile("[^e]*e"); Matcher matcher = pattern.matcher("elephant"); int count = 0; while (matcher.find()) { count++; } assertEquals(2, count);
Solo tenga en cuenta que esta solución es técnicamente correcta, pero subóptima, ya que es excesivo usar expresiones regulares muy poderosas para resolver un problema tan simple como encontrar el número de ocurrencias de un carácter en una cadena.
2.5. Uso de las funciones de Java 8
Las nuevas funciones disponibles en Java 8 pueden ser muy útiles aquí.
Usemos streams y lambdas para implementar el recuento:
String someString = "elephant"; long count = someString.chars().filter(ch -> ch == 'e').count(); assertEquals(2, count); long count2 = someString.codePoints().filter(ch -> ch == 'e').count(); assertEquals(2, count2);
Por lo tanto, esta es claramente una solución más limpia y legible que utiliza la biblioteca central.
3. Uso de bibliotecas externas
Veamos ahora algunas soluciones que utilizan utilidades de bibliotecas externas.
3.1. Usando StringUtils
En general, siempre es mejor utilizar una solución existente en lugar de inventar la nuestra. La clase commons.lang.StringUtils nos proporciona el método countMatches () , que se puede usar para contar caracteres o incluso subcadenas en una cadena determinada .
Primero, necesitamos incluir la dependencia apropiada:
org.apache.commons commons-lang3 3.5
Podemos encontrar la última versión en Maven Central.
Usemos ahora countMatches () para contar el número de caracteres 'e' en el literal String "elefante":
int count = StringUtils.countMatches("elephant", "e"); assertEquals(2, count);
3.2. Usando guayaba
La guayaba también puede ser útil para contar caracteres. Necesitamos definir la dependencia:
com.google.guava guava 21.0
Podemos encontrar la última versión en Maven Central.
Veamos cómo Guava puede ayudarnos rápidamente a contar caracteres:
int count = CharMatcher.is('e').countIn("elephant"); assertEquals(2, count);
3.3. Usando Spring
Naturalmente, agregar Spring Framework en su proyecto solo para contar caracteres no tiene sentido. Sin embargo, si ya lo tenemos en nuestro proyecto, solo necesitamos usar el método countOccurencesOf () :
int count = StringUtils.countOccurrencesOf("elephant", "e"); assertEquals(2, count);
4. Conclusión
En este tutorial rápido, nos enfocamos en varias formas de contar caracteres en la Cadena. Algunos de ellos fueron diseñados exclusivamente en Java; algunas requieren bibliotecas adicionales.
Nuestra recomendación es utilizar utilidades ya existentes de StringUtils , Guava o Spring. Sin embargo, si uno prefiere usar solo Java simple, este artículo ofrece algunas posibilidades para lograrlo bien con Java 8.
El código fuente completo para estos ejemplos está disponible en este proyecto de GitHub.