Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

file txt in array multidimensionale di double...

0 views
Skip to first unread message

gbattine

unread,
May 21, 2006, 2:27:32 PM5/21/06
to
Salve ragazzi,
volevo chiedervi un grande aiuto per un grosso problema che sto
riscontrando con un mio programmino java(sono ancora inesperto).
Vorrei che mi aiutaste ad analizzare il codice che ho scritto per
questa funzione.
Parto da del codice già scritto per un problema analogo.
Il problema originale prevedeva un file di 2 colonne fisse e numero di
righe variabili.
La funzione dovrebbe prendere in ingresso un file txt del tipo

nome dato dato dato....
xyz 23.4 345...............

e caricarlo, dopo averne riconosciuto numero righe e colonne, in un
array bidimensionale di double.
Uno dei miei dubbi è:
come avviene la trasformazione della prima colonna che è di tipo
stringa?
Nel codice originale che sto riadattando le colonne erano tutte
numeriche,posso usare Double.Parse...per una colonna di tipo stringa?
Il codice era(il numero di righe era calcolato precedentemente e
passato come parametro)


public double[][]ReadArray(int Nrows)throws IOException
{
FileReader fr=new FileReader(fileName);
BufferedReader in=new BufferedReader(fr);
double[][] x=new double[Nrows][2];

double[][]x=new double[Nrows][Ncolumns];
for(int i=0; i<Nrows; i++)
{
StringTokenizer tok=new StringTokenizer(in.readLine(),"");
x[i][0]=Double.parseDouble(tok.nextToken().trim());
x[i][1]=Double.parseDouble(tok.nextToken().trim());
}
in.close();

for(int j=0; j<Nrows; j++)
{
System.out.println(x[j][0]+""+x[j][1]);
}

return x;
}


Questo stesso codice devo "adattarlo"(potrei anche cambiarlo se ne
fossi capace...) ad un problema analogo ma con numero di colonne
variabili(non più 2 ) e numero righe variabili.
Il problema l'ho risolto in un'altra funzione che passa direttamente
numero righe e colonne.
Anche l'operazione di FileReader e BufferedReader l'ho messa nel main
perchè comune a più funzioni.
Il mio codice è questo,passo al metodo numero righe,colonne e br
caricato nel main).


public double[][]ReadArray(int Nrows,int Ncolumns,BufferedReader
br)throws IOException
{
double[][]x=new double[Nrows][Ncolumns];
for(int i=0; i<Nrows; i++)
{
for(int j=0; j<Ncolumns; j++)
{
StringTokenizer tok=new StringTokenizer(br.readLine(),"");
x[i][j]=Double.parseDouble(tok.nextToken().trim());/*restituisce il
valore double rappresentato dalla stringa(token) */
}
}
br.close();


for(int i=0; i<Nrows; i++)
{
for(int j=0; j<Ncolumns; j++)
{
System.out.println(x[i][j]);
}
}
return x;
}

Sbaglio qualcosa?
In questa situazione l'errore è

Exception in thread "main" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)
at AddDb.ReadArray(AddDb.java:47)
at AddDb.main(AddDb.java:90)


Il main è:
public static void main(String[] args)throws IOException {
FileReader file = new FileReader(fileName);
BufferedReader br = new BufferedReader(file);
double[][]Array;
AddDb db=new AddDb();
db.ColumnsNumber(br);
System.out.println("Il numero di colonne e' :"+Ncolumns);
db.RowsNumber(br);
System.out.println("Il numero di righe e' :"+Nrows);
System.out.println("Caricamento dell'array di double in corso.....");
try
{
System.out.println(db.ReadArray(Nrows,Ncolumns,br));
}
catch(IOException e){
System.out.println(e.getMessage());
}
System.out.println("Fatto");
}


Ringrazio in anticipo chi mi aiuterà....

Giambo

unread,
May 21, 2006, 2:57:02 PM5/21/06
to
gbattine wrote:

> come avviene la trasformazione della prima colonna che č di tipo
> stringa?

Double.parseDouble(String)

> Nel codice originale che sto riadattando le colonne erano tutte
> numeriche,posso usare Double.Parse...per una colonna di tipo stringa?

Tu l'hai detto (cit.)

> Sbaglio qualcosa?
> In questa situazione l'errore č


>
> Exception in thread "main" java.lang.NullPointerException
> at java.util.StringTokenizer.<init>(Unknown Source)
> at java.util.StringTokenizer.<init>(Unknown Source)
> at AddDb.ReadArray(AddDb.java:47)
> at AddDb.main(AddDb.java:90)

Come gia' detto, probabilmente passi un null al costruttore di
StringTokenizer.

--
Giambo - Occhio al filtro antispam _e_ alla whitelist !

giakyt

unread,
May 22, 2006, 4:59:33 AM5/22/06
to

gbattine ha scritto:

> Salve ragazzi,

> public double[][]ReadArray(int Nrows,int Ncolumns,BufferedReader
> br)throws IOException
> {
> double[][]x=new double[Nrows][Ncolumns];
> for(int i=0; i<Nrows; i++)
> {

qui sposti
StringTokenizer tok=new StringTokenizer(br.readLine(),"");


> for(int j=0; j<Ncolumns; j++)
> {

questa la levi
> StringTokenizer tok=new StringTokenizer(br.readLine(),"");

> x[i][j]=Double.parseDouble(tok.nextToken().trim());/*restituisce il
> valore double rappresentato dalla stringa(token) */
> }
> }
> br.close();

questo spustalo nel main, e' piu pulito


>
>
> for(int i=0; i<Nrows; i++)
> {
> for(int j=0; j<Ncolumns; j++)
> {
> System.out.println(x[i][j]);
> }
> }
> return x;
> }
>
> Sbaglio qualcosa?

si
1) non resetti il puntatore di righe sul file che si fa con mark() /
reset() oppure chiudendo e riaprendo il file
2) nel metodo ReadArray hai messo la readline quando stai processando
le colonne


> In questa situazione l'errore è
>
> Exception in thread "main" java.lang.NullPointerException
> at java.util.StringTokenizer.<init>(Unknown Source)
> at java.util.StringTokenizer.<init>(Unknown Source)
> at AddDb.ReadArray(AddDb.java:47)
> at AddDb.main(AddDb.java:90)
>
>
> Il main è:
> public static void main(String[] args)throws IOException {
> FileReader file = new FileReader(fileName);
> BufferedReader br = new BufferedReader(file);
> double[][]Array;
> AddDb db=new AddDb();

qui metti
br.mark(99999);

> db.ColumnsNumber(br);
> System.out.println("Il numero di colonne e' :"+Ncolumns);

qui metti
br.reset();
perche ad ogni operazione sul file devi resettare la posizione del
puntatore alla riga,

anche qui metti
br.mark(99999);

> db.RowsNumber(br);
> System.out.println("Il numero di righe e' :"+Nrows);

anche qui metti
br.reset();

> System.out.println("Caricamento dell'array di double in corso.....");
> try
> {
> System.out.println(db.ReadArray(Nrows,Ncolumns,br));
> }
> catch(IOException e){
> System.out.println(e.getMessage());
> }

qui metti
br.close();
spostato dal metodo ReadArray()


> System.out.println("Fatto");
> }
>
>
> Ringrazio in anticipo chi mi aiuterà....

spero di essermi spiegato
ciao
giakyt

giakyt

unread,
May 22, 2006, 5:13:20 AM5/22/06
to

gbattine ha scritto:

...


> nome dato dato dato....
> xyz 23.4 345...............
>
> e caricarlo, dopo averne riconosciuto numero righe e colonne, in un
> array bidimensionale di double.
> Uno dei miei dubbi è:
> come avviene la trasformazione della prima colonna che è di tipo
> stringa?

la prima colonna dovresti memorizzarla in un altro array

ciao

gbattine

unread,
May 22, 2006, 6:39:55 AM5/22/06
to
Giakyt sei stato grande........non ho parole,ho risolto il problema,
anche se parzialmente.
Ho tolto per ora dal file txt la colonna relativa al tipo stringa e ho
lasciato solo i numeri per testare la funzione così com'è.
Gli ho passato un file di una sola riga banalissimo
4 2 3 3 4 3 6 4
e la funzione mi calcola righe,colonne ma mi dà questa eccezione

Il numero di colonne e' :8
Il numero di righe e' :1


Caricamento dell'array di double in corso.....

Exception in thread "main" java.lang.NumberFormatException: For input
string: "4
2 3 3 4 3 6 4"
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown
Source)
at java.lang.Double.parseDouble(Unknown Source)
at AddDb.ReadArray(AddDb.java:49)
at AddDb.main(AddDb.java:93)

Perchè?

giakyt

unread,
May 22, 2006, 7:06:29 AM5/22/06
to
ti ho mandato AddDb.java modificato che non da l'eccezione che dici

0 new messages