La Classe StringTokenizer in Java

Concetti Chiave
  • La classe StringTokenizer è utilizzata per suddividere una stringa in token discreti basati su delimitatori specificati.
  • I token possono essere estratti in sequenza utilizzando i metodi nextToken() e hasMoreTokens().
  • I delimitatori possono essere personalizzati, e i token possono essere restituiti come stringhe o oggetti.
  • La classe implementa l'interfaccia Enumeration, permettendo l'iterazione sui token.
  • La classe è utile per l'analisi di stringhe formattate, come coppie chiave-valore.

StringTokenizer

L'elaborazione del testo spesso consiste nell'analizzare una stringa di input formattata.

L'analisi è la divisione del testo in un insieme di parti discrete, o token, che in una certa sequenza possono trasmettere un significato semantico.

La classe StringTokenizer fornisce il primo passo in questo processo di analisi, spesso chiamato lexer (analizzatore lessicale) o scanner. StringTokenizer implementa l'interfaccia Enumeration. Pertanto, data una stringa di input, possiamo enumerare i singoli token contenuti in essa utilizzando StringTokenizer.

Per utilizzare StringTokenizer, specifichiamo una stringa di input e una stringa che contiene i delimitatori. I delimitatori sono caratteri che separano i token. Ogni carattere nella stringa dei delimitatori è considerato un delimitatore valido—per esempio, ",;:" imposta i delimitatori a virgola, punto e virgola, e due punti. L'insieme predefinito di delimitatori consiste nei caratteri di spaziatura: spazio, tabulazione, avanzamento di pagina, nuova riga, e ritorno carrello.

I costruttori di StringTokenizer sono mostrati qui:

StringTokenizer(String str)
StringTokenizer(String str, String delimitatori)
StringTokenizer(String str, String delimitatori, boolean delimComeToken)

In tutte le versioni, str è la stringa che sarà tokenizzata. Nella prima versione, vengono utilizzati i delimitatori predefiniti. Nella seconda e terza versione, delimitatori è una stringa che specifica i delimitatori. Nella terza versione, se delimComeToken è true, allora i delimitatori vengono anche restituiti come token quando la stringa viene analizzata. Altrimenti, i delimitatori non vengono restituiti. I delimitatori non vengono restituiti come token dalle prime due forme.

Una volta creato un oggetto StringTokenizer, il metodo nextToken() viene utilizzato per estrarre token consecutivi. Il metodo hasMoreTokens() restituisce true mentre ci sono più token da estrarre. Poiché StringTokenizer implementa Enumeration, anche i metodi hasMoreElements() e nextElement() sono implementati, e agiscono allo stesso modo di hasMoreTokens() e nextToken(), rispettivamente. I metodi di StringTokenizer sono mostrati nella tabella seguente:

Metodo Descrizione
int countTokens() Utilizzando l'insieme corrente di delimitatori, il metodo determina il numero di token rimasti da analizzare e restituisce il risultato.
boolean hasMoreElements() Restituisce true se uno o più token rimangono nella stringa e restituisce false se non ce ne sono.
boolean hasMoreTokens() Restituisce true se uno o più token rimangono nella stringa e restituisce false se non ce ne sono.
Object nextElement() Restituisce il prossimo token come un Object.
String nextToken() Restituisce il prossimo token come una String.
String nextToken(String delimitatori) Restituisce il prossimo token come una String e imposta la stringa dei delimitatori a quella specificata da delimitatori.
Tabella 1: Metodi della classe StringTokenizer.

Ecco un esempio che crea un StringTokenizer per analizzare testo contenente coppie del tipo "chiave=valore". Insiemi consecutivi di coppie "chiave=valore" sono separati da un punto e virgola.

// Demo della classe StringTokenizer
import java.util.StringTokenizer;

class DemoST {

    // String di input da analizzare
    static String dati_ingresso = """
    titolo=Divina Commedia;
    autore=Dante Alighieri;
    anno=1300;
    lingua=Italiano;
    """;
    // Fine della stringa di input

    public static void main(String[] args) {
        StringTokenizer st =
            new StringTokenizer(dati_ingresso, "=;");

            while(st.hasMoreTokens()) {
                String chiave = st.nextToken();
                String valore = st.nextToken();
                System.out.println(chiave + "\t" + valore);
            }
    }

}

L'output di questo programma è mostrato qui:

titolo  Divina Commedia
autore  Dante Alighieri
anno    1300
lingua  Italiano
Nota

Alternativa Moderna: Le Espressioni Regolari

Sebbene la classe StringTokenizer sia utile per compiti semplici di tokenizzazione, è importante notare che le espressioni regolari forniscono un modo più potente e flessibile per analizzare stringhe complesse. Le espressioni regolari possono gestire casi più complessi e sono generalmente preferite per l'analisi del testo in Java.

Studieremo le espressioni regolari in dettaglio nelle prossime lezioni, dove esploreremo come utilizzarle per compiti di analisi del testo più avanzati.