Come salvare linee file di testo in un oggetto?

di il
3 risposte

Come salvare linee file di testo in un oggetto?

Salve a tutti sto cercando di leggere le seguenti informazioni da un foglio di testo. Ogni linea rappresenta una singola nota. L' obbiettivo è quello di salvare ogni nota in un oggetto (Note), creando un array di oggetti; in sostanza una melodia. Ho creato una classe Note dove le informazione di ogni linea andranno salvate. E poi una classe MelodyCatcher, dove prendo le informazione dal file, divido le linee e le salvo in un array. Il problema e che riesco correttamente a salvare una sola linea. Qualcuno può aiutarmi a risolvere questo problema?

0 60 100 24
25 72 100 24
100 60 100 24
50 60 100 24
75 72 100 24
public class Note implements Comparable {

private int time;
private int noteNumber;
private int velocity;
private int length;

public Note (int time, int noteNumber, int velocity, int length){

    this.time = time;
    this.noteNumber = noteNumber;
    this.velocity = velocity;
    this.length = length;

}


public String toString (){

    return String.format("(%s, %d, %d, %d)", time, noteNumber, velocity, length);
}

@Override
public int compareTo(Note note) {

    return this.time - note.time;
}
}


Questa è la classe dove sussiste il problema
public class MelodyCatcher{

public static Note[] n = new Note[5];

public static void main(String[] args) throws IOException {

    FileReader fr = new FileReader ("/Users/enricomomo/Desktop/Text/file1.txt");
    BufferedReader br = new BufferedReader (fr); //Info stored into a buffer
    String ln = br.readLine(); //Lines are read from the buffer and stored into a variable
    StringTokenizer st = new StringTokenizer(ln);

        while(st.hasMoreTokens()) // read each number in this line
        {
		//Questa è la parte che non riesco a risolvere
		
	     n[0] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
           n[1] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
           n[2] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
           n[3] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
           n[4] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));

        }

        System.out.println("The notes are " + Arrays.toString(n));
        Arrays.sort(n);
        System.out.println("The notes stored are " + Arrays.toString(n));

    br.close();
}    
}

3 Risposte

  • Re: Come salvare linee file di testo in un oggetto?

    Innanzitutto da Java 5 Comparable è una interfaccia "generica", quindi è bene usarla parametrizzata.

    public class Note implements Comparable<Note> {

    Se non metti quel <Note>, il metodo compareTo NON puoi metterlo con parametro Note (non sarebbe un override corretto).
    Inoltre fare la differenza tra due int generalmente non è buona cosa. Meglio se fai i 3 casi distinti (minore, maggiore, uguale) oppure da Java 7 puoi sfruttare il nuovo int compare(int x, int y) statico di Integer.

    Per il resto direi che grosso modo Node va bene (sebbene per ora non hai ancora messo getter/setter).


    Riguardo MelodyCatcher la questione è che se vuoi leggere "a righe" con BufferedReader, vuol dire che devi fare un ciclo in cui ripeti il br.readLine() e per ciascuna riga crei un nuovo StringTokenizer per estrarre i token da quella riga.
    Così come l'hai fatto NON va assolutamente bene.
  • Re: Come salvare linee file di testo in un oggetto?

    Ho inserito un while loop, ma non riesco a capire dove stia sbagliando
            
            FileReader fr = new FileReader ("/Users/enricomomo/Desktop/Text/file1.txt");
            BufferedReader br = new BufferedReader (fr); //Info stored into a buffer
      
               String ln = null;
        
            while ((ln = br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(ln);
            while(st.hasMoreTokens()) // read each number in this line
            {
    
                n[0] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
                n[1] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
                n[2] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
                n[3] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
                n[4] = new Note(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
    
            }
    
            System.out.println("The notes are " + Arrays.toString(n));
            Arrays.sort(n);
            System.out.println("The notes stored are " + Arrays.toString(n));
        }
    
        br.close();
        fr.close();
      }
    }
  • Re: Come salvare linee file di testo in un oggetto?

    Non ha assolutamente senso (esattamente come prima) che continui a mettere

    n[0] = new Note( ..... );
    n[1] = new Note( ..... );
    ecc..

    dentro il ciclo del readLine. Ad ogni ciclo del readLine leggi 1 riga, che ti fornirà 4 token che dovranno essere usati per creare 1 (!) oggetto Note.
    Eseguendo in ripetizione N cicli, allora costruirai N oggetti Note.

    E questo vuol dire anche che devi usare un'altra variabile int di "indice", che usi per indirizzare progressivamente nell'array e che incrementi ad ogni ciclo. Non puoi mettere indici fissi 0 1 2.. !!

    Sul discorso del hasMoreTokens() la questione è: ti aspetti che ogni riga abbia SEMPRE 4 token? Se sì, hasMoreTokens puoi non usarlo.
    Basta prendere indiscriminatamente 4 token. Se ce ne fossero di meno avresti una eccezione e puoi decidere se saltare solo quella riga, far fallire tutta l'applicazione o altra azione a tua scelta.
Devi accedere o registrarti per scrivere nel forum
3 risposte