PROBLEMA [JAVA] Perché non riesco ad aggiungere elementi all'array?

crissstian96

Utente Attivo
44
0
Ho la necessità di memorizzare il risultato di un StringTokenizer in un array, dunque ho creato questo breve codice:
Codice:
import java.util.*;
public class Algo {
public static void main(String args[]){
String eq = "ciao a tutti";
StringTokenizer st = new StringTokenizer(eq, " ", false);
String s[] = new String[st.countTokens()];
    while(st.hasMoreTokens()){
        String k = (String)st.nextToken();
        System.out.println(k);
        int i = 0;
        s[i] = k;
        i++;
        }
    
    System.out.println(s[2]);


}
}

Nell'ultima stringa, quando stampo s[2] dovrebbe restituirmi l'ultima parola, invece mi restituisce null (e questo accade anche con 0 e 1), siccome sto seguendo un libro un po' vecchiotto forse è cambiato qualcosa, qualcuno può aiutarmi? :help:
 
Ultima modifica:

matteoc91

Utente Attivo
158
17
Ciao, hai commesso un "errore logico" qua:
Codice:
import java.util.*;
public class Algo {
public static void main(String args[]){
String eq = "ciao a tutti";
StringTokenizer st = new StringTokenizer(eq, " ", false);
String s[] = new String[st.countTokens()];
    while(st.hasMoreTokens()){
        String k = (String)st.nextToken();
        System.out.println(k);
       [SIZE=2][B] int i = 0;[/B][/SIZE]
        s[i] = k;
        i++;
        }
    
    System.out.println(s[2]);


}
}
Ogni volta che iteri all'interno del ciclo while ri-dichiari una variabile i inizializzata a 0; ciò significa che anche se alla fine del ciclo la incrementi, nella successiva iterazione questa non sarà più presente, ma verrà ricreata una nuova variabile i inizializzata nuovamente a 0; in poche parole il ciclo che hai creato funziona solo per inizializzare il primo elemento dell'array.
La print ti mostra la suddivisione corretta della stringa perché utilizza il nextToken di st e non sfrutta né l'indice i, né il vettore s :)

In poche parole:
-s ha dimensione 3 (indici da 0 a 2);
-il ciclo while carica solo il primo elemento di questo vettore (per il discorso fatto prima sull'indice);
-dato che carichiamo sempre e solo il primo elemento, questo nelle varie iterazioni del ciclo viene sovrascritto, quindi nella prima vale "ciao", nella seconda "a" e nella terza e ultima "tutti";
-le posizioni 2 e 3 di s non vengono mai inizializzate e di default assumono valore null
-s[0] esce dal ciclo con l'ultimo valore passatogli ("tutti" che sovrascrive "a" che a sua volta aveva sovrascritto "ciao")
-s[1] ed s[2] continuano ad essere null e quindi printando s[2] stamperai null

Se provi a fare una print di tutti gli elementi dell'array dopo il while avrai:
tutti
null
null

Per risolvere il problema basta che dichiari ed inizializzi a 0 l'indice i prima dell'apertura del ciclo while ;)
 

crissstian96

Utente Attivo
44
0
Oddio che errore stupidissimo :blush: dopo 2 anni che programmo (con altri linguaggi ovviamente) un errore così non mi è ammissibile, al di là del fatto che mi ero appena svegliato. Mi sta venendo voglia di andare a zappare la terra xD comunque grazie mille, rapido e completissimo.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili