
bart
tengo la cuerda
a.b.c.d
Quiero contar las apariciones de ‘.’ de una manera idiomática, preferiblemente de una sola línea.
(Anteriormente había expresado esta restricción como “sin bucle”, en caso de que se pregunte por qué todos intentan responder sin usar un bucle).

cowan
Mi ‘una sola línea idiomática’ para esto es:
int count = StringUtils.countMatches("a.b.c.d", ".");
¿Por qué escribirlo usted mismo cuando ya está en idioma común?
El oneliner de Spring Framework para esto es:
int occurance = StringUtils.countOccurrencesOf("a.b.c.d", ".");
Tarde o temprano, algo tiene que hacer un bucle. Es mucho más simple para usted escribir el ciclo (muy simple) que usar algo como split
que es mucho más poderoso de lo que necesitas.
Por supuesto, encapsule el ciclo en un método separado, por ejemplo
public static int countOccurrences(String haystack, char needle)
{
int count = 0;
for (int i=0; i < haystack.length(); i++)
{
if (haystack.charAt(i) == needle)
{
count++;
}
}
return count;
}
Entonces no necesita tener el ciclo en su código principal, pero el ciclo debe estar allí en alguna parte.
Tuve una idea similar a Mladen, pero todo lo contrario…
String s = "a.b.c.d";
int charCount = s.replaceAll("[^.]", "").length();
println(charCount);

Comunidad
String s = "a.b.c.d";
int charCount = s.length() - s.replaceAll("\\.", "").length();
ReplaceAll(“.”) reemplazaría todos los caracteres.
La solución de PhiLho usa ReplaceAll(“[^.]”,””), que no necesita escaparse, ya que [.] representa el carácter ‘punto’, no ‘cualquier carácter’.
¿Tarea? Porque de lo contrario no veo el requisito para evitar el ciclo.
– Filho
9 de noviembre de 2008 a las 16:13
No es tan reacio a un bucle como a buscar una frase idiomática.
– Bart
17 de noviembre de 2008 a las 14:28
Los bucles se crearon para un problema como este, escriba el bucle en una clase de utilidad común y luego llame a su trazador de líneas recién acuñado.
-che javara
01/09/2015 a las 21:31
Pregunta similar para cadenas: stackoverflow.com/questions/767759/…
– koppor
16/04/2017 a las 19:41
Solo para señalar: aprecio encontrar las frases ingeniosas, es divertido y (como una verdadera ventaja) a menudo es fácil de recordar, pero me gustaría señalar que un método separado y un bucle son mejores en casi todos los sentidos. –legibilidad e incluso rendimiento. La mayoría de las soluciones “Elegantes” a continuación no funcionarán muy bien porque implican reformar cadenas/copiar memoria, mientras que un ciclo que solo escanea la cadena y cuenta las ocurrencias sería rápido y simple. No es que el rendimiento deba ser un factor en general, pero no mire el one-line sobre un bucle y asuma que funcionará mejor.
– Bill K.
4 mayo 2017 a las 17:41