Array di parole

di il
13 risposte

Array di parole

Vorrei creare un metodo che data una frase, prenda ogni parola e la metta in una cella di un vettore che passo come parametro insieme alla stringa...

Ho pensato di scriverlo così:

public static String[] estraiToken(String stringa)
	{
		//definizione variabili
		String token[];
		int n_token=0, i=0;
		Scanner lettore= new Scanner(stringa);
	
		while(lettore.hasNext())
		{
			lettore.next();
			n_token++;		
		}
		
		token= new String[n_token];
		lettore.reset();
		for(i=0;i<n_token;i++)
		{
			token[i]=lettore.next();
		}
		
		return token;
		
	}
Come errore mi dà questo però:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at GeneralUtil.estraiToken(GeneralUtil.java:65)
at PuntiRetteMain.main(PuntiRetteMain.java:8)

Questo il main

 static String token[];	
	public static void main(String[] args)
	{
		token=GeneralUtil.estraiToken("Ciao bella!");
        }
Dove sto sbagliando?

Grazie

13 Risposte

  • Re: Array di parole

    Perché non usi il metodo "split" di String?
  • Re: Array di parole

    
            String s = " Ciao, come stai? Io molto bene";
    
            String[] r = s.split("[A-Za-z]+");
    
            System.out.println(r.length);
    
    Abbastanza compatto?

    Ora la versione complicata .

    Inizia con definire il termine parola.

    Che cosa e' una parola? Una sequenza di caratteri minuscoli? E i caratteri maiuscoli? Puo' contenere dei numeri? E qualche altro tipo di carattere (ad esempio '_')?

    Oppure, in alternativa: che cosa e' un separatore di parole?

    Ovviamente lo spazio, ma la virgola? Il punto e virgola? Il punto di domanda? (ecc).

    A partire da questi concetti, devi realizzare quello che nei compilatori si chiama scanner lessicale: scandisce i caratteri in ingresso, uno alla volta, e genera dei token, che nel tuo caso saranno le parole.

    Uno scanner lessicale si realizza mediante un automa a stati finiti.

    Pensavi fosse una cosa banale?

    Forse si, forse no
  • Re: Array di parole

    schumy2000 ha scritto:


    Perché non usi il metodo "split" di String?
    Pero' bisogna sapere che cosa sono le espressioni regolari!
  • Re: Array di parole

    Il metodo split sembra carino, non lo conoscevo, però non so cosa siano le espressioni regolari... sto seguendo il primo corso di java all'università Non credevo fosse così complicato anche perchè per parola intendo qualunque carattere compreso tra 2 whitespace, indipendentemente che siano caratteri numerici o letterali, quindi senza fare alcun tipo di "discriminazione". Nel metodo split cosa vuol dire

    "[A-Za-z]+" ?

    Grazie per le risposte intanto
  • Re: Array di parole

    E allora è facile....
    
    String testo="Ciao ciao come va?"
    String[] words=testo.split(" ");
    for (int i=0; i<words.lenght; i++){
    	System.out.println(words[i]);
    }
    
    ovviamente ti uscirà fuori
    words[0]==> Ciao
    words[1]==> ciao
    words[2]==> come
    words[3]==> va?


    Ciao
  • Re: Array di parole

    Mattia541993 ha scritto:


    Nel metodo split cosa vuol dire
    "[A-Za-z]+" ?
    E' una regex! Non sottovalutarle assolutamente, possono essere incredibilmente complicate!


    Nel metodo "estraiToken", invece, immagino che l'errore te lo dia la riga "token = lettore.next()". Questo perché il metodo "reset()" di Scanner non ti consente di riportare lo scanner indietro al punto di partenza, ma semplicemente resetta alcune impostazioni (ad esempio il separatore, oppure la base di lettura dei numeri).
  • Re: Array di parole

    Non complicate, potenti .
  • Re: Array di parole

    Senza dubbio! Ma sono 2 proprietà direttamente proporzionali direi
  • Re: Array di parole

    Ho capito lo split e proverò a usarlo nella sua forma più minimale senza regex che penso che per ciò che devo fare vada bene, per quanto riguarda il mio metodo, come potrei risolvere il problema del next()?
  • Re: Array di parole

    Beh il punto è che con lo scanner puoi sapere quante parole l'utente ha inserito solamente dopo averle lette tutte e, a questo punto, non puoi più tornare indietro! Per cui se non salvi queste parole a mano a mano che le leggi allora le perdi definitivamente. Il problema di "salvarle subito" in un array è che non puoi sapere a priori quante parole ci saranno, per cui ti tocca creare un array di una dimensione che potrebbe rivelarsi non sufficiente (ad esempio tu lo crei di 100 elementi ma l'utente inserisce 101 parole).

    Una possibile soluzione potrebbe vedere l'utilizzo di strutture dinamiche come le liste, cosa che ti risolverebbe la questione della dimensione fissata a priori.
  • Re: Array di parole

    Creare 2 scanner, uno per creare un numero e un altro per leggere di nuovo le varie parole potrebbe essere un'idea?
  • Re: Array di parole

    Se dovessi leggere da un file andrebbe anche bene..ma visto che l'input viene da tastiera allora l'utente dovrebbe scrivere le stesse cose 2 volte!
  • Re: Array di parole

    Capito... allora farò un lungo array.. Grazie ancora
Devi accedere o registrarti per scrivere nel forum
13 risposte