Newsgroup: it.comp.java
Titolo: passare da arraylist ad array

Salve a tutti,
ho provato a leggere un file, ma non conoscendo in principio il numero
di elementi ho usato un arraylist per memorizzarli , per poi passarlo
ad un array che mi fornirebbe il valore in uscita. Ho scritto qualcosa
di questo tipo però ho dei problemi:
import java.io.DataInputStream;
import java.util.ArrayList;
import java.util.Scanner;
public class ReadData{
	private double[] Data;
	public ReadData(DataInputStream file) {
		try {
			ArrayList<Double> data = new ArrayList<Double>();
			Scanner datafile = new Scanner(new DataInputStream(file));
			int idx = 0;
			while (datafile.next() != null) {
				data.add(idx, Double.parseDouble(datafile.next()));
				idx++;
			}
			Data = new double[data.size()];
			for (int i = 0; i < Data.length; i++) {
				Data[i] = data.get(i);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public double[] getData() {
		return Data;
	}
}
Purtroppo credo non inizializzi l'array perchè mi dà un errore del
tipo:
java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Unknown Source)
	at java.util.Scanner.next(Unknown Source)
	at ReadData.<init>(ReadData.java:23)
	at Main.main(Main.java:109)
Sembra che fuori dal ciclo while l'arraylist non venga più visto... a
volte mi sono succese cose simili, ma con variabili anzichè array,
quindi, si deve mettere qualche istruzione che per caso faccia uscire
il valore al di fuori del ciclo? Se così non fosse come fare?
Purtroppo il file lo devo leggere da zippato, altrimenti, visto che ha
un elemento per riga, avrei usato le seguenti istruzioni:
LineNumberReader lnr = new LineNumberReader(new
FileReader(stringfile));
		total = 0;
		while (lnr.readLine() != null) {
			total++;
		}
passandogli il nome del file, ma in questo caso non lo posso fare. Chi
mi può dare qualche suggerimento?
Grazie

 	data.add(idx, Double.parseDouble(datafile.next()));
Qui mi sembra ci sia un errore: chiami il metodo next due volte per lo 
stesso ciclo.
Ciao,
Paolo

 writes:
A> Salve a tutti, ho provato a leggere un file, ma non conoscendo in
A> principio il numero di elementi ho usato un arraylist per
A> memorizzarli , per poi passarlo ad un array che mi fornirebbe il
A> valore in uscita. Ho scritto qualcosa di questo tipo però ho dei
A> problemi:
Perdona, perché non usi il metodo 
         <T> T[] toArray(T[] a) 
per tirare fuori l'array ?
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software
A Cesare avrei detto di scrivermi a 
fn...@rat.vg

 per tirare fuori l'array ?
Perdonami tu, ma non riesco a capire come fare, neppure guardando la
documentazione...
cmq ha ragione paolo, in quel modo leggo saltando una riga ogni
volta...

 			}
Mi permetto di andare un po' OT.
Per convertire una lista in un array non serve fare tutto questo, e' 
sufficiente un:
Data = data.toArray( new Double[0] );
Inoltre, i nomi delle variabili e' meglio scriverli con l'iniziale 
minuscola.
 > Purtroppo credo non inizializzi l'array perchè mi dà un errore del
 > tipo:
 >
 > java.util.NoSuchElementException
 > 	at java.util.Scanner.throwFor(Unknown Source)
 > 	at java.util.Scanner.next(Unknown Source)
 > 	at ReadData.<init>(ReadData.java:23)
 > 	at Main.main(Main.java:109)
Nelle eccezioni c'e' (quasi) sempre scritta la vera causa del problema.
In questo caso l'eccezione ti dice che alla riga 23 della tua classe, 
dove fai:
data.add(idx, Double.parseDouble(datafile.next()));
il programma e' andato in errore mentre eseguiva il metodo 
Scanner.next(), quindi in corrispondenza del tuo codice: datafile.next()
 > Sembra che fuori dal ciclo while l'arraylist non venga più visto... a
 > volte mi sono succese cose simili, ma con variabili anzichè array,
La prossima volta prova a interpretare lo stacktrace dell'eccezione, 
perche' questa frase l'hai scritta senza tenerne minimamente conto.
 > Purtroppo il file lo devo leggere da zippato, altrimenti, visto che ha
 > un elemento per riga, avrei usato le seguenti istruzioni:
 >
 > LineNumberReader lnr = new LineNumberReader(new
 > FileReader(stringfile));
 > 		total = 0;
 > 		while (lnr.readLine() != null) {
 > 			total++;
 > 		}
Non capisco, la tua classe ReadData sembra essere stata progettata per 
caricare dei valori double contenuti in un file binario, e ora dici di 
dover contare le righe di un file di testo zippato? Forse mi sfugge 
qualcosa...
-- 
SoulSpirit

> per tirare fuori l'array ?
A> Perdonami tu, ma non riesco a capire come fare, neppure guardando
A> la documentazione...
Oserei dire 
AnyType t[] = arrayList.toArrayList(new AnyType[0]);
o anche 
AnyType t[] = arrayList.toArrayList(new AnyType[arrayList.size()
visto che senza i generics era
AnyType t[] = (AnyType [])arrayList.toArrayList(new AnyType[0]);
AnyType t[] = (AnyType [])arrayList.toArrayList(new AnyType[arrayList.size()



Inanzitutto grazie per i suggerimenti. Il mio codice si blocca quando
scrivo: Data = new double[data.size()];
perchè, finchè sono nel ciclo while l'indice idx viene aggiornato e se
faccio una stampa su schermo esce fuori qualcosa...quindi per questo
non mi so spiegare come mai non si riesce ad assegnare l'array...
Per quanto riguarda il file, esso è zippato. Dal main lo richiamo nel
seguente modo:
DataInputStream file = new DataInputStream(new GZIPInputStream(	new
FileInputStream(filename.toString())));
ReadData ReadData = new ReadData (file);
purtroppo non so se ci sono alternative più semplici, visto che sono
ancora molto inesperta e questa istruzione l'ho trovata online.
Se il file non fosse stato zippato potevo fare una conta delle righe e
sapere quanti erano gli elementi dall'inizio, così mi evitavo
l'arraylist, ma LineNumberReader lavora solo se in ingresso ho un tipo
String e non DataInputStream come l'ho definito... dico bene?

 purtroppo non so se ci sono alternative più semplici
E' un po' intricato, ma puoi comunque ottenere il tuo LineNumberReader, 
cosi':
LineNumberReader lnr = new LineNumberReader( new InputStreamReader( new 
GZIPInputStream( new FileInputStream( filename ) ) ) );
Per capirlo si fa cosi':
partendo dal presupposto che per te e' necessario usare GZIPInputStream 
per decomprimere il tuo stream, a questo GZIPInputStream devi passare un 
"flusso di dati" che nel tuo caso e' contenuto in un file, il 
FileInputStream serve appunto per "convertire" un file in uno stream.
Ora hai un GZIPInputStream, che e' una specializzazione di InputStream, 
ma per creare un LineNumberReader hai bisogno di un Reader, che e' 
simile all'InputStream, ma non e' con esso compatibile.
Per questo motivo devi convertire il tuo InputStream in Reader, e 
InputStreamReader serve proprio a questo.
Infine, avendo un'istanza di Reader puoi creare il LineNumberReader che 
ti necessita.
-- 
SoulSpirit

 questo caso, di scegliere se fargli leggere un formato zippato o no?
Credo che la soluzione piu' semplice sia quella di provare ad aprire il 
GZIPInputStream sul tuo InputStream come gia' fai e gestire l'eventuale 
eccezione lanciata dal costruttore.
Se GZIPInputStream non riconosce il formato dello stream dovrebbe 
lanciarti una IOException.
-- 
SoulSpirit