¿Cómo cuento el número de ocurrencias de un carácter en una cadena?

6 minutos de lectura

¿Como cuento el numero de ocurrencias de un caracter en
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).

  • ¿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

1646974928 628 ¿Como cuento el numero de ocurrencias de un caracter en
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", ".");

  • Guayaba equivalente: int count = CharMatcher.is('.').countIn("a.b.c.d"); …Como respondió dogbane en una pregunta duplicada.

    – Jonik

    12/08/2013 a las 17:00


  • Aunque no voy a rechazar esto, (a) requiere librerías de terceros y (b) es costoso.

    – Proyectos de la costa oeste

    23 de enero de 2014 a las 21:24

  • Esto solo funciona con el trabajo del marco de resorte que tiene que importar.

    –Isuru Madusanka

    29 sep 2015 a las 10:45


  • si alguien lo necesita: grepcode.com/file/repo1.maven.org/maven2/commons-lang/…

    – CV2

    27 de noviembre de 2015 a las 12:54


  • Lo que ha sido costoso, en todas las empresas en las que he trabajado, es tener muchas clases de “*Utilidades” mal escritas y mal mantenidas. Parte de su trabajo es saber qué está disponible en Apache Commons.

    – Abu Nassar

    5 oct 2016 a las 14:58

  • Las cadenas impresas no coinciden con las anteriores, y el orden es el más rápido primero, lo que hace que la búsqueda sea complicada al menos. Buena respuesta de otra manera!

    -Maarten Bodewes

    1 de junio de 2017 a las 11:05

  • caso 2, generalizado para puntos de código que necesitan más de una unidad de código UTF-16: "1🚲2🚲3 has 2".codePoints().filter((c) -> c == "🚲".codePointAt(0)).count()

    – Tom Blodget

    1 ago 2018 a las 22:50

  • Apache Commons StringUtils.countMatches bucles sobre índices y usos charAt; marco de primavera StringUtils.countOccurencesOf usos indexOf repetidamente. (OpenJDK String.indexOf básicamente utiliza charAt en un bucle.)

    – Salomón Ucko

    18 de agosto de 2020 a las 20:29

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.

  • for (int i=0,l=haystack.length(); i < l; i++) sea amable con su pila

    – Chris

    29 de noviembre de 2009 a las 13:43

  • (Ni siquiera estoy seguro de dónde viene la parte de “pila” del comentario. No es como esta La respuesta es mi recursiva, que de hecho es desagradable para la pila).

    – Jon Skeet

    29 de noviembre de 2009 a las 14:51

  • no solo eso, sino que posiblemente sea una optimización anti sin tener en cuenta lo que hace el jit. Si hizo lo anterior en una matriz for loop, por ejemplo, podría empeorar las cosas.

    – ShuggyCoUk

    30 de noviembre de 2009 a las 11:15

  • @sulai: la preocupación de Chris es infundada, en mi opinión, frente a un trivial Optimización JIT. ¿Hay alguna razón por la que ese comentario llamó su atención en este momento, más de tres años después? Solo interesado.

    – Jon Skeet

    12 de junio de 2014 a las 13:39

  • Probablemente @sulai se encontró con la pregunta como yo (mientras me preguntaba si Java tenía un método incorporado para esto) y no notó las fechas. Sin embargo, tengo curiosidad de cómo mover el length() la llamada fuera del bucle podría dificultar el rendimiento peorcomo lo mencionó @ShuggyCoUk algunos comentarios más arriba.

    – J Killian

    30 de julio de 2014 a las 2:19

Tuve una idea similar a Mladen, pero todo lo contrario…

String s = "a.b.c.d";
int charCount = s.replaceAll("[^.]", "").length();
println(charCount);

  • for (int i=0,l=haystack.length(); i < l; i++) sea amable con su pila

    – Chris

    29 de noviembre de 2009 a las 13:43

  • (Ni siquiera estoy seguro de dónde viene la parte de “pila” del comentario. No es como esta La respuesta es mi recursiva, que de hecho es desagradable para la pila).

    – Jon Skeet

    29 de noviembre de 2009 a las 14:51

  • no solo eso, sino que posiblemente sea una optimización anti sin tener en cuenta lo que hace el jit. Si hizo lo anterior en una matriz for loop, por ejemplo, podría empeorar las cosas.

    – ShuggyCoUk

    30 de noviembre de 2009 a las 11:15

  • @sulai: la preocupación de Chris es infundada, en mi opinión, frente a un trivial Optimización JIT. ¿Hay alguna razón por la que ese comentario llamó su atención en este momento, más de tres años después? Solo interesado.

    – Jon Skeet

    12 de junio de 2014 a las 13:39

  • Probablemente @sulai se encontró con la pregunta como yo (mientras me preguntaba si Java tenía un método incorporado para esto) y no notó las fechas. Sin embargo, tengo curiosidad de cómo mover el length() la llamada fuera del bucle podría dificultar el rendimiento peorcomo lo mencionó @ShuggyCoUk algunos comentarios más arriba.

    – J Killian

    30 de julio de 2014 a las 2:19

1646974929 491 ¿Como cuento el numero de ocurrencias de un caracter en
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’.

  • Me gusta este. Todavía hay un bucle allí, por supuesto, como tiene que haber.

    – El Pablo arquetípico

    9 de noviembre de 2008 a las 15:13

  • NB que necesitaría dividir este número si quisiera buscar subcadenas de longitud> 1

    – rogerdpack

    03/04/2012 a las 23:11

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad