Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 42
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37

    Generare array ordinabili partendo da un txt

    Ciao a tutti, eccomi nuovamente qua bisognoso di soccorso...

    Che dire, stavolta sono proprio nei guai, devo creare un progetto ( x allenarmi) per il prossimo che uscirà che penso/spero sia simile per la preparazione di un orale in programmazione (java)... bene detto questo vi espongo il problema:

    parto da un file esterno OrariTreno.txt da qui devo leggere il suo contenuto, e tramite awt visualizzare il contenuto in vari ordini impostati in base ad una choice... faccio un paio di esempi:

    il file di testo può essere questo:
    codice:
    Numero Orari | Orario di partenza | Città di partenza | Orario di Arrivo | Città di arrivo | Costo biglietto
    3                   10:00                   Udine                   12:00             Venezia              8 euro 
    8                    4:00                    Bologna                 5:00              Firenze              4 euro
    4                   12:00                   Cosenza                08:00             Torino               56 euro
    Gli orari, tempi e costi dei biglietti sono buttati a caso...

    Allora io devo prendere questo file di testo ( la prima riga con le specificazioni di cosa sto guardando non mi serve leggerla, utilizzo dei label ed è fatta..)

    A livello di interfaccia grafica posso usare soltanto awt...

    Lui ci ha consigliato/imposto di usare l'awt.list, awt.choice, una textarea ( che servirà una volta aquistato il biglietto)...

    Ho letto molto in giro e si parla di usare l'interfaccia comparable.. per ora son riuscito a creare l'interfaccia grafica ( abbastanza corretta) e un programma che legge un file txt e lo stampa a schermo, ora mi rimane "unire" i 2 programmi e dopo lavorare sull'ordinamento...

    oltre all'ovvietà di mettere un ascoltatore sulla choice ( perché devo ordinare gli orari in base a 4 tipologie differenti di scelta della choice ovvero secondo: Orario di partenza / Città di partenza / Orario di Arrivo / Città di Arrivo) ... scegliendo deve cambiarmi l'ordine della list ma non soltanto nella colonna ( altrimenti avrei usato + array) ma tutta la stringa tirata sul da file txt, che devo "scomporre" in qualche modo ( in array ? ) il problema è come faccio a far ordinare questo array estrapolato da una stringa e dargli degli appigli al resto della stringa??

    non so se mi son spiegato bene...

    se scelgo di ordinare in base alle partenze deve risultare questo:

    codice:
    Numero Orari | Orario di partenza | Città di partenza | Orario di Arrivo | Città di arrivo | Costo biglietto
    8                     4:00                  Bologna                5:00                Firenze             4 euro
    3                   10:00                   Udine                 12:00                Venezia            8 euro 
    4                   12:00                   Cosenza             08:00                Torino             56 euro
    poi c'è un'altra parte che prevede la selezione ( suppongo per questo l'uso della list) e una volta scelto si può acquistare il biglietto scelto e il programma deve mandare fuori un messaggio di output in una textarea...

    intanto provo a fondere i 2 programmini, se avete consigli/idee vi accolto a braccia aperte..
    grazie.
    Sarà, ma finché non funziona... non è migliorabile!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280

    Re: Generare array ordinabili partendo da un txt

    Originariamente inviato da Luca1986
    A livello di interfaccia grafica posso usare soltanto awt...
    Beh ok. È solo un peccato perché con Swing avresti fatto prima e meglio .... ma se ti è stato detto così, va bene, non stiamo a discutere.

    Originariamente inviato da Luca1986
    Lui ci ha consigliato/imposto di usare l'awt.list, awt.choice, una textarea ( che servirà una volta aquistato il biglietto)...
    Ok. List servirà, immagino, per visualizzare i dati che hai riportato prima. In AWT non esiste un componente "tabella", purtroppo.

    Originariamente inviato da Luca1986
    Ho letto molto in giro e si parla di usare l'interfaccia comparable..
    Comparable va implementato in una tua classe per definire l'ordinamento "naturale" di quei oggetti.

    Originariamente inviato da Luca1986
    per ora son riuscito a creare l'interfaccia grafica ( abbastanza corretta) e un programma che legge un file txt e lo stampa a schermo, ora mi rimane "unire" i 2 programmi e dopo lavorare sull'ordinamento...
    Sarebbe stato meglio partire prima con la parte non grafica. Insomma, con tutto ciò che è l'I/O di quei dati e la "modellazione" in classi di questi dati.

    Hai già individuato le entità in gioco? Dovresti creare delle classi che "modellano" quei dati che hai riportato. Io vedo almeno 2 entità: un "orario" (es. "5:00") e un record che è una linea di quel file. Quindi sarebbe appropriato fare una classe Orario e un'altra, non saprei bene come chiamarla, es. Treno.

    Originariamente inviato da Luca1986
    tutta la stringa tirata sul da file txt, che devo "scomporre" in qualche modo ( in array ? )
    Devi ragionare in termini di oggetti e "modellare" le varie entità con delle classi, l'ho detto prima. Se non hai fatto questo, lascia perdere per il momento la interfaccia grafica ... e parti dal "basso" concentrandoti su queste questioni.
    Poi ovviamente avrai un array (o collezione) di un tuo tipo che rappresenta il tuo "record".

    Originariamente inviato da Luca1986
    il problema è come faccio a far ordinare questo array estrapolato da una stringa e dargli degli appigli al resto della stringa??
    Se hai un array o collezione di un tuo tipo, fare diversi tipi di ordinamenti è banale. Basta implementare vari Comparator in classi separate. Comparable va implementato nella "tua" classe e pertanto ne hai solo 1 (che dovrebbe rappresentare l'ordinamento "naturale" dei tuoi oggetti). Puoi fare N altri ordinamenti definendo classi a parte che implementano Comparator.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37
    allora sono andato avanti (poco) ma sempre meglio di niente...

    per prima cosa ho notato che l'orario "suggerito" da utilizzare forse è più semplice di quello che avevo postato in quanto dovrebbe essere suddiviso per riga...

    del tipo:
    codice:
    3                
    10:00        
    Udine 
    12:00   
    Venezia 
    8 euro 
    
    8
    4:00   
    Bologna
    ..
    ..ecc
    Quindi leggendo in giro... ho capito che invece di usare in buffereader per ogni lettera, potrei usare il readline() giusto ?? E magari trovo un modo per convertire quello che leggo per ogni riga in una stringa...

    Se il testo fosse fatto come sopra invece dovrebbe essere usata una gestione dei token ( per trovare le interruzioni come i ":" o ";" che tuttavia ho solo capito che serve a quello ma non saprei come implementarla...

    cosa ho combinato.. ho trovato una classe e un programmino e li ho riaddatati ai miei fini, in questo caso gestiscono l'ordinamento di un'array di stringhe in ordine alfabetico..

    La classe che gestisce i nomi utilizzando Comparable...
    codice:
    import java.util.*;
    
    public class Nome implements Comparable<Nome> {
        private final String Nome;
    
        public Nome(String Nome) {
        if (Nome == null )  {
          throw new NullPointerException();
    	}
    	this.Nome = Nome;
        }
    
        public String Nome() {
    	return Nome;
        }
        
        public boolean equals(Object o) {
            if (!(o instanceof Nome))
                return false;
            Nome n = (Nome)o;
            return n.Nome.equals(Nome);
        }
    
        public int hashCode() {
            return 31*Nome.hashCode();
        }
    
        public String toString() {
    	return Nome;
        }
    
        public int compareTo(Nome n) {
            return (Nome.compareTo(n.Nome));
        }
    }
    Il programma che mi ordina 2 array di stringhe

    codice:
    import java.util.*;
    
    public class NomeOrdinamento {
        public static void main(String[] args) {
         
    	 // I nomi delle città devono venire dal file di testo txt!!!
    	 Nome cittaPartenza[] = { new Nome("Udine"),  new Nome("Bologna"),new Nome("Cosenza")};
    	 Nome cittaArrivo[]   = { new Nome("Venezia"),new Nome("Firenze"),new Nome("Torino")};
    	 
    	 List<Nome> cittaPart = Arrays.asList(cittaPartenza);// Crea un ArrayList (cittaPartenz) basandosi sull'array cittaPartenza
         Collections.sort(cittaPart);// Ordina la collezione con un ordine alfabetico
    	 	      
    	 List<Nome> cittaArriv = Arrays.asList(cittaArrivo);// Crea un ArrayList (cittaArriv) basandosi sull'array cittaArrivo
    	 Collections.sort(cittaArriv);// Ordina la collezione con un ordine alfabetico
    	 	 
    	 System.out.println(cittaPart+"\n"+cittaArriv);
      }
    }
    essendo riaddatatta (sopratutto la classe) vorrei sapere se l'implementazione è giusta oppure ho messo qualcosa di troppo.. in quanto alcuni punti non mi sono proprio chiari... :master:

    Cos'altro... si ora devo riuscire a tirare su dal file di testo delle stringhe usando readline()...
    ( accetto suggerimenti, magari un semplice esempio), una volta fatto questo, le stringhe numeriche le converto in numeri con Integer.parseInt(String) e visto che il programma per l'ordinamento delle stringhe "alfabetiche" l'ho già rimediato va abbastanza bene...

    mi rimane sempre il problema di come far "settare" i parametri gli uni rispetto agl'altri...

    su suggerimento di andbin ho implementato una semplice classe Orario... tuttavia non è ancora implementata per "l'ordinamento naturale"... e accetto suggerimenti..

    codice:
    class Orario {
      
      private int numero;
      private int ora;
      private int minuti;
      
      public Orario(int numero, int ora, int minuti) {
     	this.numero = numero;
    	this.ora = ora;
    	this.minuti = minuti;
      }
      
      public int getOra() {
      return ora;
      }
      
      public int getMinuti() {
      return minuti;
      }
      
      public int getNumero() {
      return numero;
      }
            
    }
    sto progetto non so voi ma mi fa diventare matto...

    come faccio a collegare "relazionare" array ( oppure arraylist ?? ) di stringhe distinti ???? :berto:
    Sarà, ma finché non funziona... non è migliorabile!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da Luca1986
    per prima cosa ho notato che l'orario "suggerito" da utilizzare forse è più semplice di quello che avevo postato in quanto dovrebbe essere suddiviso per riga...
    È un po' più semplice perché non devi "spezzare" una linea per estrarre i vari "campi". Ma così il formato è un po' più "critico" e meno "robusto" perché si basa su un insieme di linee che devono essere ben "contate". Non ci sono "marcatori" particolari che indicano l'inizio (e/o fine) di un "record". Quindi devi andare avanti prendendo le cose così come sono. Pensa solo a cosa succederebbe se (per qualunque motivo/problema) una riga "saltasse" via. Sfalserebbe tutto quanto dopo!

    Comunque se ti è stato imposto questo formato, ok.

    Originariamente inviato da Luca1986
    Quindi leggendo in giro... ho capito che invece di usare in buffereader per ogni lettera, potrei usare il readline() giusto ??
    A dire il vero leggere carattere per carattere sia in questo nuovo formato che in quello che avevi postato prima, è poco utile e pure molto scomodo. Leggere carattere per carattere avrebbe senso in altre situazioni ma non in questa.

    Il vero punto di forza di BufferedReader è appunto il fatto che offre readLine().

    Originariamente inviato da Luca1986
    E magari trovo un modo per convertire quello che leggo per ogni riga in una stringa...
    Leggendo "a righe", hai già stringhe! Per i dati che sono appunto stringhe (es. il nome della città) non devi fare nulla, per altri dati come ad esempio l'orario o il costo dovresti "parsare" la stringa per avere un valore numerico.

    Originariamente inviato da Luca1986
    Se il testo fosse fatto come sopra invece dovrebbe essere usata una gestione dei token ( per trovare le interruzioni come i ":" o ";" che tuttavia ho solo capito che serve a quello ma non saprei come implementarla...
    Con il record tutto su una riga, certo, dovevi "spezzare" la linea.

    Originariamente inviato da Luca1986
    cosa ho combinato.. ho trovato una classe e un programmino e li ho riaddatati ai miei fini, in questo caso gestiscono l'ordinamento di un'array di stringhe in ordine alfabetico..

    La classe che gestisce i nomi utilizzando Comparable...
    codice:
    import java.util.*;
    
    public class Nome implements Comparable<Nome> {
        private final String Nome;
    ....
    No no, dovresti creare una classe che "modella" un intero "record". String tra l'altro è già Comparable, la tua classe Nome che "modella" solo 1 String è inutile!!!

    Originariamente inviato da Luca1986
    Cos'altro... si ora devo riuscire a tirare su dal file di testo delle stringhe usando readline()...
    ( accetto suggerimenti, magari un semplice esempio)
    Guarda tra i miei Java Examples (vedi firma), nella sezione Input/Output l'esempio LoadSaveBooksList.java

    Originariamente inviato da Luca1986
    su suggerimento di andbin ho implementato una semplice classe Orario... tuttavia non è ancora implementata per "l'ordinamento naturale"... e accetto suggerimenti..

    codice:
    class Orario {
      
      private int numero;
      private int ora;
      private int minuti;
      
      public Orario(int numero, int ora, int minuti) {
     	this.numero = numero;
    	this.ora = ora;
    	this.minuti = minuti;
      }
      
      public int getOra() {
      return ora;
      }
      
      public int getMinuti() {
      return minuti;
      }
      
      public int getNumero() {
      return numero;
      }
            
    }
    La classe Orario, tecnicamente, va bene. Il campo "numero" lo vedo fuori posto, nel senso che "numero" dovrebbe essere una "proprietà" della classe che modella il "record", non in Orario. E il record ha ovviamente 2 campi di tipo Orario!

    Originariamente inviato da Luca1986
    sto progetto non so voi ma mi fa diventare matto...
    Capisco ... ma per fare bene le cose bisognerebbe avere un buon grado di confidenza con la OOP (programmazione orientata agli oggetti).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37
    sull'ultima nota... il grado di confidenza è medio/scarso, il progetto si riferisce a quello finale del primo esame di programmazione.... ( quest'anno inizierò il corso di OOP unicamente dedicato alla OOP...)

    Queste "vastita" di cose che stiamo discutendo NON sono state viste e spiegate durante il corso... io credimi ci sto provando a capirle ma senza una "struttura" non è facile venirne a capo...

    Quindi se ho ben capito tu mi dici di creare un record ( classe ? ) e di gestire all'interno di essa gli orari (orari di arrivo e orari di partenza... anche le città?) quindi un record dovrebbe essere composto da 6 stringhe..

    tipo:

    Record 1 = new Record {"3","10:00","Udine","12:00","Venezia","8 euro"};

    Le stringhe in questione dovrei leggerle da file tipo così:

    codice:
    import java.io.*;
    
    public class CopyBufferedRead {
        public static void main(String [] args) throws IOException {
    
         BufferedReader filebuf = new BufferedReader(new FileReader("OrariTreni.txt")); 
    	
         String nextStr;
         nextStr = filebuf.readLine();     
         while (nextStr != null){
            System.out.println(nextStr);  
            nextStr = filebuf.readLine();    	
         } 
         filebuf.close(); 
      }
    }
    Sapresti consigliarmi come suddividere le stringhe e creare un array di stringhe? o forse ancora meglio un arraylist di stringhe?

    Ora provo a generare una classe record..

    Ho dato un occhiata ai tuoi file che sono sicuramente ottimi, ma credimi, davvero complessi per uno che non è abituato!
    Sarà, ma finché non funziona... non è migliorabile!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37
    Mi è venuto in mente...

    si potrebbe gestire la cosa così... ( forse ) sicuramente l'approccio non è il migliore ma a livello logico mi sembra il più semplice...

    Leggo il file txt, e per ogni stringa la monto in un array ( lunghezza finita so che i campi da riempire sono 6)...

    ad esempio:

    OrariTreni.txt

    3
    1000
    Udine
    1200
    Venezia
    8 euro

    8
    04:00
    Bologna
    05:00
    Firenze
    4 euro

    4
    12:00
    Cosenza
    08:00
    Torino
    56 euro

    diventa

    Array 1 = {"3","1000","Udine","1200","Venezia","8 euro"};
    Array 2 = {"8","0400","Bologna","0500","Firenze","4 euro"};
    Array 3 = {"4","1200","Cosenza","0800","Torino",56 euro"};

    Dopodichè in base agl'INDICI degli array li copio ( in base a quello da ordinare) in un altro array che mi ordina ogni indice in base al parametro che imposto...

    ArrayOrdinaTutto = { "3","8","4"}; Prima
    ArrayOrdinaTutto = { "3","4","8"}; Dopo

    e me lo ritorna in una matrice? o una list??

    Solo che questo metodo ha il limite che la eventuale matrice risultate sarebbe:

    Orari ( Versione sbagliata )
    3 , 1000 , Udine , 1200 , Venezia , 8 euro
    4 , 0400 , Bologna , 0500 , Firenze , 4 euro
    8 , 1200 , Cosenza , 0800 , Torino , 56 euro

    e invece dovrei farla venire fuori così...

    3 , 1000 , Udine , 1200 , Venezia , 8 euro
    4 , 1200 , Cosenza , 0800 , Torino , 56 euro
    8 , 0400 , Bologna , 0500 , Firenze , 4 euro

    (In questo caso ho fatto l'ordinamento sul numero orario ( che devo ancora capire che cazz centra.. fossero stato "binario" dove si prende il treno avrebbe molto più senso..))

    Sto vaneggiando o potrebbe essere un modo?
    Sarà, ma finché non funziona... non è migliorabile!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da Luca1986
    Quindi se ho ben capito tu mi dici di creare un record ( classe ? ) e di gestire all'interno di essa gli orari (orari di arrivo e orari di partenza... anche le città?) quindi un record dovrebbe essere composto da 6 stringhe..
    No, non 6 stringhe!

    Originariamente inviato da Luca1986
    Sapresti consigliarmi come suddividere le stringhe e creare un array di stringhe? o forse ancora meglio un arraylist di stringhe?
    Non ti serve alcun array, ti servirebbe una collezione (lista) che contiene oggetti del "tuo" record.

    Originariamente inviato da Luca1986
    Sto vaneggiando o potrebbe essere un modo?
    Ehm ... la prima che hai detto ....

    Adesso ti spiego e vedrai che sarà più chiaro. Prendiamo un momento il vecchio formato (ma solo perché aveva la intestazione ed era compatto):
    codice:
    Numero Orari | Orario di partenza | Città di partenza | Orario di Arrivo | Città di arrivo | Costo biglietto
    3              10:00                Udine               12:00              Venezia           8 euro
    Hai 6 campi:
    - Numero Orari (è un valore numerico intero)
    - Orario di partenza (è un valore composto, "modellabile" con una classe apposita)
    - Città di partenza (è un String)
    - Orario di arrivo (idem come l'altro orario)
    - Città di arrivo (è un String)
    - Costo biglietto (nella riga di esempio è un valore intero ma supponiamo in generale un valore decimale, quindi es. float)

    La cosa più logica è "modellare" questi dati con una classe che rappresenta questo "record" di informazioni.

    codice:
    public class Treno {
        private int numeroOrari;
        private Orario orarioPartenza;
        private String cittaPartenza;
        private Orario orarioArrivo;
        private String cittaArrivo;
        private float costoBiglietto;
    
        ... costruttore/i e metodi (getter/setter e altri) ....
    }
    Vedi come "mappa" bene i vari campi?? Ed è per questo motivo che ti ho detto che in Orario il "numero" è fuori luogo. Orario dovrebbe "modellare" solo l'orario ora/minuti ... non altro che non centra niente.

    Io l'ho chiamata Treno ma se hai un nome che descrive meglio il record per ciò che devi fare, cambialo, ovviamente!

    A questo punto devi poi solo avere una lista (es. ArrayList<Treno>) in cui aggiungi oggetti di tipo Treno.
    Ordinare una lista è poi banale, c'è sort() di java.util.Collections che può ordinare o in base a Comparable o in base a Comparator.
    Visto che dovrai fare diversi ordinamenti, basta fare tante classi separate ognuna che implementa Comparator<Treno> e in cui implementi il metodo compare().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37
    A questo punto devi poi solo avere una lista (es. ArrayList<Treno> ) in cui aggiungi oggetti di tipo Treno.
    Ordinare una lista è poi banale, c'è sort() di java.util.Collections che può ordinare o in base a Comparable o in base a Comparator.
    Visto che dovrai fare diversi ordinamenti, basta fare tante classi separate ognuna che implementa Comparator<Treno> e in cui implementi il metodo compare().
    bhe banale... insomma... forse x te? :rollo:

    Vabbè, cmq ora proverò a implementare una classe ( treno è più che azzecato), e le relative classi ( figlie presumo....) dopo proviamo a lavorare sulla lista e sull'ordinamento...

    A questo punto devi poi solo avere una lista (es. ArrayList<Treno> ) in cui aggiungi oggetti di tipo Treno.
    Si ma gli oggetti di tipo Treno li devo "generare" dal foglio OrariTreni.txt... e quindi son riuscito a fare i "vaneggiamenti" di prima... che sicuramente è migliorabile come codice...

    codice:
    import java.io.*;
    
    public class LeggiFile3 {
      public static void main(String [] args) throws IOException {
    	  
      String primoOrario[]   = new String [6];
      String secondoOrario[] = new String [6];
      String terzoOrario[]   = new String [6];
      
      // incapsula in BufferedReader un file aperto in lettura 
      BufferedReader filebuf = new BufferedReader(new FileReader("OrariTreni.txt")); 
      
      for(int i = 0; i < primoOrario.length; i++) {
    	primoOrario[i] = filebuf.readLine();
      }
      
      if (filebuf != null){
      filebuf.readLine();
      }
      	   
      for(int i = 0; i < secondoOrario.length; i++) {
    	secondoOrario[i] = filebuf.readLine();
      }
      
      if (filebuf != null){
      filebuf.readLine();
      }	   
      
      for(int i = 0; i < terzoOrario.length; i++) {
    	terzoOrario[i] = filebuf.readLine();
      }
      
      filebuf.close();  // chiude il file 
    
      System.out.println("\nContenuto del primoArray\n"); 
      for(int i = 0; i < primoOrario.length; i++) {
    	  System.out.print(primoOrario[i]+" ");
      }
      System.out.println();
      System.out.println("\nContenuto del secondoArray\n");
      for(int i = 0; i < secondoOrario.length; i++) {
    	  System.out.print(secondoOrario[i]+" ");
      }
      System.out.println();
      System.out.println("\nContenuto del terzoArray\n");
      for(int i = 0; i < terzoOrario.length; i++) {
    	  System.out.print(terzoOrario[i]+" ");
      }
      
      }
    }
    il risultato è questo:
    codice:
    Contenuto del primoArray
    
    3 1000 Udine 1200 Venezia 8 euro
    
    Contenuto del secondoArray
    
    8 0400 Bologna 0500 Firenze 4 euro
    
    Contenuto del terzoArray
    
    4 1200 Cosenza 0800 Torino 56 euro
    Potrei "convertire" gli array in oggetti di tipo Treno, fare una lista ( anche se devo capire bene come diamine si fà...) e quindi ordinarla... Giusto? :master:

    Ma ho un dubbio in questo modo.... si riesce a "scegliere" l'ordinamento tramite una choice?????????????????

    Son già le 16.00 ... tra poco devo andare..
    Sarà, ma finché non funziona... non è migliorabile!

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da Luca1986
    bhe banale... insomma... forse x te? :rollo:
    Per me sì, è facile ma ti assicuro che difficile non lo è, in generale. Ci sono cose molto più difficili che implementare un Comparator e usare Collections.sort()!

    Originariamente inviato da Luca1986
    Potrei "convertire" gli array in oggetti di tipo Treno, fare una lista ( anche se devo capire bene come diamine si fà...) e quindi ordinarla... Giusto? :master:
    Ripeto ancora una volta che non avresti alcun bisogno di usare array!!!

    I dati testuali restano String. I dati numerici singoli li devi parsare con Integer.parseInt() (per il numero orari) e Float.parseFloat() (per il costo del biglietto).
    Nota solo che per il costo del biglietto non puoi passare a parseFloat() la stringa "8 euro"! Devi estrarre prima la sola parte numerica.

    E poi c'è anche l'orario, ovviamente. Ma qui è un campo "composto" che devi comunque spezzare con ":" e poi parsare ora e minuti.
    E ti conviene fare una cosa molto buona e logica. Mettere nella classe Orario un metodo statico es:

    public static Orario parseOrario(String str)

    Che si occupa di parsare la stringa dell'orario. Così non solo non devi ripetere più volte lo stesso codice (hai 2 orari) ma il codice è pure ben "incapsulato" nella classe Orario, che è appunto il luogo più appropriato dove fare questa operazione.

    Dopotutto, se ci pensi, Integer ha parseInt() perché è Integer che "sa" il formato, parseFloat() e in Float e parseOrario() ..... è in Orario!! Logico, no?

    Se l'orario non è valido o malformato, il metodo potrebbe lanciare una eccezione come IllegalArgumentException o una "tua" eccezione (es. OrarioMalformatoException che magari estende IllegalArgumentException).

    Originariamente inviato da Luca1986
    Ma ho un dubbio in questo modo.... si riesce a "scegliere" l'ordinamento tramite una choice?????????????????
    Certo ma lo ripeto, hai bisogno di una lista di oggetti Treno.

    Molto abbozzato (eh beh, devi farlo tu, no?) il codice della conversione potrebbe essere:

    codice:
    ArrayList<Treno> listaTreni = new ArrayList<Treno>();
    
    ...inizio ciclo....
        String strNumeroOrari = br.readLine();
        String strOrarioPartenza = br.readLine();
        ....
    
        int numeroOrari = Integer.parseInt(strNumeroOrari);
        Orario orarioPartenza = Orario.parseOrario(strOrarioPartenza);
        ....
       
        Treno t = new Treno(numeroOrari, orarioPartenza, ........);
    
        listaTreni.add(t);
    ...fine ciclo...
    Alla fine hai una bella lista di oggetti Treno. Ed è stato semplice e lineare, no?
    Visto che un record è su più righe, l'unica questione particolare è come determinare la fine del file. readLine() ritorna null in quel caso.
    Siccome sarebbe sbagliato se arriva la fine in "mezzo" al record, una cosa logica è questa. Il primo readLine() (del numero orari) se ritorna null vuol dire fine del file (e termini il ciclo), per gli altri readLine() se ritornano null vuol dire "errore" (e farai altro magari).

    La lista la tieni poi in un campo di istanza da qualche parte, es. nella classe dove crei e gestisci il java.awt.List. Quando ricevi notifica del cambiamento nel choice, ordini la lista con uno dei Comparator e poi setti tutti i dati nel componente List.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    37
    dunque...

    Ho fatto un paio di bozze...

    la classe treno..

    codice:
    public class Treno {
    
        private int numeroOrari;
        private Orario orarioPartenza;
        private String cittaPartenza;
        private Orario orarioArrivo;
        private String cittaArrivo;
        private float costoBiglietto;
    
        public Treno (int numeroOrari, Orario orarioPartenza,
    			 String cittaPartenza, Orario orarioArrivo, 
    			   String cittaArrivo, float costoBiglietto) {
    	
    	this.numeroOrari = numeroOrari;
    	this.orarioPartenza = orarioPartenza;
    	this.cittaPartenza = cittaPartenza;
    	this.orarioArrivo = orarioArrivo;
    	this.cittaArrivo = cittaArrivo;
    	this.costoBiglietto = costoBiglietto;
    	
    	}
    	
    	public int getNumeroOrari() {
         return numeroOrari;
        }
    	public Orario getOrarioPartenza() {
    	 return orarioPartenza;
    	}
    	public String getCittaPartenza() {
    	 return cittaPartenza;
    	}
    	public Orario getOrarioArrivo() {
    	 return orarioArrivo;
    	}
    	public String getCittaArrivo() {
    	 return cittaArrivo;
        } 
        public float getCostoBiglietto() {
    	 return costoBiglietto;
    	}
    }
    il file che dovrebbe leggere il testo senza l'utilizzo degli array... ( tuttavia ancora non funziona)

    come posso fare a fargli distinguere i file letti in input?? io mi son basato sulla "riga".. ovvero so già in precedenza che cosa vado a leggere ( se orario, città... ecc...).. che comunque mi da errore..
    codice:
    import java.io.*;
    
    class ProvaTreno {
      public static void main(String[] args)throws IOException {
    	  
      Treno udineVenezia[] = new Treno [6];
      
      // incapsula in BufferedReader un file aperto in lettura 
      
      BufferedReader filebuf = new BufferedReader(new FileReader("OrariTreni.txt")); 
    
      if ( filebuf != null) {
    	  
        for(int i = 0; i <= 6; i++) {    
          
    	  if (filebuf != String) {
          
    	    udineVenezia[i] = Integer.parseInt(); 
           
    	  }else{
          
    	    udineVenezia[i] = filebuf.readline();
          
    	  } 
        
    	  filebuf.readLine(); //legge la successiva riga finchè non ne trova una non vuota...
      
      }
    
      filebuf.close();      //chiude il file 
    
      }
    }
    }
    L'errore è questo:
    [I]
    ProvaTreno.java:16: cannot find symbol
    symbol : variable String
    location: class ProvaTreno
    if (filebuf != String) {
    ^
    ProvaTreno.java:18: incompatible types
    found : java.io.BufferedReader
    required: Treno
    udineVenezia[i] = filebuf;
    ^
    ProvaTreno.java:22: cannot find symbol
    symbol : method readline()
    location: class java.io.BufferedReader
    udineVenezia = filebuf.readline();
    ^
    3 errors
    Compilazione fallita.


    la classe orario.. su cui sto lavorando...

    codice:
    class Orario {
      
      private int ora;
      private int minuti;
    
      public Orario(int ora, int minuti) {
    	this.ora = ora;
    	this.minuti = minuti;
      }
    
      public static Orario parseOrario(String stringaOrario) {
      String nuovoOrario = stringaOrario;
      String[] arr = nuovoOrario.split("\\.|,");
      for(int i = 0; i < arr.length; i++) {
      }
      ora = arr[0];
      minuti = arr[1];
      }
        
     
      public int getOra() {
       return ora;
      }
      
      public int getMinuti() {
       return minuti;
      }
            
    }
    mi puoi consigliare?
    Sarà, ma finché non funziona... non è migliorabile!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.