2012-05-20 8 views
5

Necesito contar el número de palabras y supongo que la manera correcta de hacerlo es calculando el número de veces que el carácter anterior en una cadena no es una letra (es decir, otros caracteres) porque esto supone que hay serían dos puntos, espacios, pestañas y otros signos en la cadena. Así que al principio mi idea era colocar a través de cada personaje y contar las veces que usted no recibe una carta de un alfabeto¿Cómo cuento el número de palabras en una cadena?

for(int i = 0; i < string.length(); i++) { 
     for(int j = 0; i < alphabets.length(); j++) { 
     if (string.charAt(i-1) == alphabets.charAt(j)) { 
      counter++; 
     } 
    } 
    } 

Sin embargo siempre voy a conseguir un arreglo fuera de los límites debido a esto. Entonces, necesito un poco de ayuda o de otra manera que pueda ser más eficiente. Pensé en utilizar coincidencias solo para [a-zA-z], pero no estoy seguro de cómo manejar un char para que sea comparable a una cadena al contar cuántas veces ocurre.

Gracias

+3

Solo hay una palabra en java. –

+2

¿Es esta tarea? –

+0

¿Este es un recuento de * todas * palabras, o solo * palabras * únicas? –

Respuesta

2

Su sugerencia de usar una expresión regular como "[A-Za-z]" funcionaría bien. En un comando dividido, se dividiría en el inverso, como:

Cadena [] words = "Prueba de ejemplo: uno, dos, tres" .split ("[^ A-Za-z] +");

EDITAR: Si solo buscas la velocidad bruta, esto hará el trabajo más rápidamente.

public static int countWords(String str) { 
    char[] sentence = str.toCharArray(); 
    boolean inWord = false; 
    int wordCt = 0; 
    for (char c : sentence) { 
     if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') { 
      if (!inWord) { 
       wordCt++; 
       inWord = true; 
      } 
     } else { 
      inWord = false; 
     } 
    } 
    return wordCt; 
} 
+0

Hasta ahora creo que dividirlos es una forma más eficiente. Y creo que me facilitará la tarea de resolver la siguiente tarea también. Requiere más tiempo de procesamiento, pero creo que no tengo otra opción por el momento. – nfnmy

+0

+1 - Este es exactamente el algoritmo que tenía en mente (que ha codificado). @nfnmy El enfoque de división tiene casos de esquina que fallarán y también será más lento. No estoy seguro de entender por qué elegirías usarlo. – cheeken

+0

Sí, este es un código realmente eficiente. Pero creo que usaré el método de división por ahora, lo que hace que mi tarea sea más fácil en términos de manipularlos en una matriz para otros cálculos con fines estadísticos. Gracias, Phatfingers. Definitivamente voy a mantener este para las referencias, ya que no he visto este algoritmo antes. ¡salud genio! – nfnmy

3

Puede utilizar String.split() para convertir la cadena en una matriz, con una palabra en cada elemento. El número de palabras viene dado por la longitud de la matriz:

int words = myString.split("\s+").length; 
+2

¿Contar? La matriz tiene una propiedad 'length'. –

+0

Y tal vez use una expresión regular para dividir como '\ s +'. –

+0

, así que debería intentar dividir esta cadena larga en una matriz en función de si el carácter coincide con [a-zA-Z], hmmm .. – nfnmy

0
if (string.charAt(i-1) == alphabets.charAt(j)) { 
     counter++; 
    } 

Usted está incrementando el contador si el personaje es un poco de carácter alfabeto. Debe incrementarlo si es sin carácter del alfabeto.

1

La razón por la que está obteniendo un IndexOutOfBoundsException es probablemente porque cuando yo soy 0 su bucle interno tendrá string.charAt(i-1) que lanzará una excepción ya que 0-1 es -1. Si arregla, su método podría funcionar, aunque puede usar técnicas más eficientes.

1

Abordar el código directamente, el primer bucle tiene i = 0 como el primer valor de i , pero luego de pedir

String.charAt (i-1) = String.charAt (-1),

que es de donde proviene su matriz fuera de límites.

El segundo bucle tiene otro problema:

for (int j = 0; i < alphabets.length(); j ++) {

También puede desear considerar apóstrofos como parte de las palabras también.

+0

+1 para encontrar ambos errores – phatfingers

2

Este problema es un poco más complicado de lo que permite su algoritmo.

  • ¿Qué pasa si hay dos o más espacios en una fila?
  • ¿Qué sucede si la cadena se inicia o finaliza con espacios en blanco (o caracteres que no son palabras)?

Esto parece una tarea, por lo que no deseo proporcionar ningún código. Sugiero un enfoque alternativo que es más simple de pensar.

  • Recorre los caracteres de la cadena, uno por uno.
  • Haga algo para recordar si actualmente está escaneando una palabra o si actualmente no está escaneando una palabra.
  • Haga algo para determinar cuándo ingresa o deja una palabra, e incremente su contador en consecuencia.
+0

Gracias por la sugerencia. Sí, realmente no espero ningún código, solo meramente más consejos y cómo puedo abordar este problema de manera más eficiente. Realmente no me gusta ser cuchareado con respuestas. – nfnmy

Cuestiones relacionadas