Allora andiamo con ordine: il primo codice che hai postato non è completo (mancano alcune variabili che usi in seguito) ma già si vedono alcune cose parecchio dubbie.
Perché la tua classe automobili ha un campo
marca (con metodo get associato) e un costruttore in cui inizializzi
km,
annoImmatricolazione,
targa etc., valori che tra l'altro non si vede come usi in seguito?
Questo mi sembra un terribile macello, in cui mischi informazioni che dovrebbe contenere una classe base (che dovresti chiamare Automobile, e dovrebbe mantenere informazioni relative alla singola automobile, come marca, km, annoImmatricolazione e tutto il resto), con quella che può benissimo essere una classe contenitore/di test come Automobili.
Può andare bene che Automobili abbia un vettore di marche, creato come vuoi (quindi anche letto dal file, ma ne parliamo dopo), ma quel costruttore di Automobili così come è scritto non ha alcun senso.
A me sembra che qui serva un bel ripasso delle basi o, se ho capito male io quello che stai cercando di fare (anche perché il codice non è completo), cerca di spiegarti meglio (ma confermo che mi sembra tutto molto dubbio, e una riga come
if (stato.equals("false")) è proprio una
bestemmia).
Per quanto riguarda la lettura con Scanner, mi pare che tu abbia capito perché era sbagliato, tieni comunque presente che:
while (reader.hasNextLine() == true)
Andrebbe scritto come:
while (reader.hasNextLine ()) // while (!reader.hasNextLine ()) se vuoi fare la negazione, che in questo caso non ha senso.
Perché un valore boolean è già sufficiente per il test, non serve farne l'uguaglianza o meno con un altro boolean (in pratica staresti scrivendo if (true == true), o simili, quando ti basta if (true)).
KuroKami69 ha scritto:
Ok domanda che può sembrare molto stupida:
perché con il for riesco a far uscire i dati dal cilo mentre con il while no?
non credo centri la dichiarazione di i dentro al while no? alla fine è la stessa cosa del for
edit:
bhe effettivamente se dichiaro la i fuori dal while allora funziona...
ma dichiararla nello statment del for oppure dentro al while, non è la stessa cosa?
Se ti riferisci a questa parte di codice (ho solo corretto la condizione del while):
while (reader.hasNextLine())
{
int i = 0;
marche[i] = reader.nextLine(); //riempio il mio vettore leggendo da file
i++;
//return marche[i];
}
La variabile i viene inizializzata a 0
ad ogni iterazione, quindi stai sempre sovrascrivendo la stringa in marche [0].
Quindi non è che con il while non si riesca a "far uscire i dati" dal ciclo.
Se il for l'hai invece scritto in questo modo:
for (int i = 0; reader.hasNextLine (); i ++)
Questo vuol dire che i viene inizializzata a 0 subito prima di iniziare la prima iterazione, ma poi ad ogni iterazione viene incrementata, non ritorna a 0 ogni volta, quindi è ben diverso "dichiarare i nello statement del for oppure dentro al while", il for che ho scritto coincide appunto con il dichiarare i
fuori dal while, e incrementarla ad ogni iterazione.
KuroKami69 ha scritto:
edit2:
son riuscito a far funzionare anche il bufferedreader, anche se non capisco perché, mi prende solo 35 voci su 71...
Il codice che stai usando:
while (reader.readLine() != null)
{
int i = 0;
marche[i] = reader.readLine(); //riempio il mio vettore leggendo da file
i++;
//return marche[i];
}
E' sbagliato, perché ad ogni iterazione leggi due righe (con reader.readLine ()), quindi ne
butti via una delle due (quella che usi nella condizione del while).
Quella riga invece va assegnata ad una variabile, altrimenti te la perdi. Il modo consueto per fare questo è il seguente:
String line; // Dichiaro una variabile a cui verrà assegnata in loop ogni riga del file.
while ((line = reader.readLine ()) != null) { // assegno a line il valore di reader.readLine (), e controllo che non sia uguale a null
// uso la variabile line, stavolta senza perdere nessuna riga.
// es. marche [i] = line; i ++;
}
KuroKami69 ha scritto:
edit3:
perché il metodo:
public String setMarcaRandom()
{
int tmp = rng.nextInt(71);
marca = marche[tmp];
return marca;
}
della classe automobili (vedere primo post, c'è lo script completo) mi ritorna null? non ci arrivo proprio. in teoria gli sto dicendo:
1) mi crei una variabile "temporanea" a cui assegni un random da 0 a 71
2) mi assegni alla variabile marca, dichiarata all'inizio della classe, il valore nella posizione data da tmp del vettore marche
3) mi ritorni la variabile modificata
giusto no? o mi son perso qualche passaggio base?
Quello che hai scritto è tecnicamente giusto (a parte il fatto che il numero random va da 0 a
70), bisogna vedere cosa contiene marche all'indice casuale che hai estratto, se la lettura da file non è corretta è possibile (anzi molto probabile) che in molti indici del vettore ci sia ancora il valore null.