2012-05-20 34 views
5

Ho bisogno di contare il numero di parole e sto assumendo che il modo corretto per farlo sia calcolando il numero di volte in cui il carattere precedente in una stringa non è una lettera (cioè altri caratteri) perché questo è per supporre che sarebbero i due punti, spazi, tabulazioni e altri segni nella stringa. Così in un primo momento la mia idea era quella di collegare attraverso ogni personaggio e contare quante volte che non sarà possibile ottenere una lettera di un alfabetoCome posso contare il numero di parole in una stringa?

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++; 
     } 
    } 
    } 

Tuttavia ho sempre ottenere un array fuori dai limiti a causa di questo. Quindi, ho bisogno di un piccolo aiuto o di un altro modo che possa effettivamente essere più efficiente. Ho pensato di usare le corrispondenze solo su [a-zA-z] ma non sono sicuro di come gestisco un char per essere paragonabile a una stringa nel contare quante volte si verifica.

Grazie

+3

C'è solo una parola in java. –

+2

Sono questi compiti? –

+0

Si tratta di un conteggio di * tutte * parole o solo * uniche * parole? –

risposta

2

Il tuo suggerimento di utilizzare un'espressione regolare come "[A-Za-z]" funzionerebbe correttamente. In un comando di divisione, ti dividerei al contrario, ad esempio:

String [] words = "Test di esempio: uno, due, tre" .split ("[^ A-Za-z] +");

MODIFICA: Se stai solo cercando la velocità raw, questo farà il lavoro più rapidamente.

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

Finora penso di dividerli in un modo più efficiente. E penso che renderà più facile per me risolvere anche il prossimo compito. Richiede più tempo di elaborazione ma penso di non avere altra opzione per ora. – nfnmy

+0

+1 - Questo è esattamente l'algoritmo che avevo in mente (che hai il codice per). @nfnmy L'approccio split ha casi d'angolo che falliscono ed è anche più lento. Non sono sicuro di capire perché sceglieresti di usarlo. – cheeken

+0

sì questo è un codice veramente efficiente. Ma penso che per ora userò il metodo split, il che mi rende più facile il mio compito in termini di manipolazione in un array per altri calcoli a fini statistici. Grazie phatfingers. Sicuramente manterrò questo per i riferimenti in quanto non ho visto questo algoritmo prima. acclamazione geniale! – nfnmy

3

È possibile utilizzare String.split() per convertire la stringa in un array, con una sola parola in ogni elemento. Il numero di parole è dato dalla lunghezza della matrice:

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

Contare? La matrice ha una proprietà 'length'. –

+0

E magari usare una espressione regolare per dividere come '\ s +'. –

+0

quindi dovrei provare a suddividere questa lunga stringa in un array in base a se il carattere corrisponde diverso da [a-zA-Z], hmmm .. – nfnmy

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

Si stanno incrementando il contatore se il personaggio è qualche personaggio alfabeto. Dovresti incrementarlo se è no caratteri alfabetici.

1

Il motivo per cui si ottiene un IndexOutOfBoundsException è probabilmente dovuto al fatto che quando ho 0 il ciclo interno avrà string.charAt(i-1) che genererà un'eccezione poiché 0-1 è -1. Se si risolve il problema, il metodo potrebbe funzionare, sebbene sia possibile utilizzare tecniche più efficienti.

1

Rivolgendosi direttamente il codice, il tuo primo ciclo ha i = 0 come primo valore di i, ma poi si chiede

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

da cui proviene il proprio array-fuori-limite.

Il secondo ciclo ha un altro problema:

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

Si potrebbe anche prendere in considerazione gli apostrofi come parti di parole pure.

+0

+1 per trovare entrambi i bug – phatfingers

2

Questo problema è leggermente più complicato di quello consentito dall'algoritmo.

  • Cosa succede se ci sono due o più spazi in fila?
  • Cosa succede se la stringa inizia o termina con spazi bianchi (o caratteri non parole)?

Questo sembra un compito a casa, quindi non voglio fornire alcun codice. Suggerisco un approccio alternativo che è più semplice da pensare.

  • Cammina attraverso i caratteri nella stringa, uno per uno.
  • Fai qualcosa da ricordare se stai attualmente scandendo una parola o se al momento non stai scandendo una parola.
  • Fai qualcosa per determinare quando inserisci o lascia una parola e aumenta il tuo contatore di conseguenza.
+0

Grazie per il suggerimento. Sì, non mi sto aspettando alcun codice, ma solo un po 'più di suggerimenti e come posso affrontare questo problema in modo più efficiente. Non mi piace davvero essere sconcertato dalle risposte. – nfnmy

Problemi correlati