PROBLEMA Esercizio riferimenti icrociati JAVA

mexexx

Nuovo Utente
4
0
Salve a tutti gli utenti
devo risolvere un esercizio Java per la gestione degli accessi ad alcune piste da sci mediante Skipass.
Le piste sono rappresentate dal file piste.txt cosi organizzato:

  • nome pista(Es. Settevalli)
  • difficoltà(es. intermedia)
  • Orario apertura
  • orario chiusura
  • costo di accesso(es. 5 euro)
Gli Skipass sono rappresentati dal file skipass.txt cosi organizzato:

  • codice skipass
  • credito(es. 150) euro
  • cod fiscale del possessore
  • Elenco Piste accedute(varia da skipass in skipass, ovviamente l'elenco è vuoto all'atto dell'acquisto)
  • #(simbolo che conclude l'elenco delle piste accedute)
Infine i dati dei possessori di Skipass sono organizzati el file sciatori.txt cosi composto:

  • cod fiscale
  • nome
  • cognome
  • città
  • numero di tel
Devo implementare i vari filtri compreso un metodo che quando uno sciatore si presenta ad una pista verifichi se il credito sullo skipass è sufficiente per accedervi e in tal caso aggiornare l'elenco delle piste accedute sullo skipass.
Ho dunque provveduto a creare la prima classe Pista:


Codice:
public class Pista {
    private String nome,tipo;
     private double costo;
     private Date oraA,oraC;
    
    public Pista (String nome, String tipo, Date oraA, Date oraC, double costo){
        this.nome=nome;
        this.tipo=tipo;
        this.oraA=oraA;
        this.oraC=oraC;
        this.costo=costo;
        
    }


    public String getNome() {
        return nome;
    }


    public String getTipo() {
        return tipo;
    }


    public double getCosto() {
        return costo;
    }


    public Date getOraA() {
        return oraA;
    }


    public Date getOraC() {
        return oraC;
    }
    
    public static Pista read(Scanner sc) throws ParseException{
        String nome,tipo;
        Date oraA,oraC;
        double costo;
        if(!sc.hasNextLine())return null;
        nome=sc.nextLine();
        if(!sc.hasNextLine())return null;
        tipo=sc.nextLine();
        if(!sc.hasNextLine())return null;
        oraA=(new SimpleDateFormat("HH:mm:ss").parse(sc.nextLine()));
        if(!sc.hasNextLine())return null;
        oraC=(new SimpleDateFormat("HH:mm:ss").parse(sc.nextLine()));
        if(!sc.hasNextLine())return null;
        costo=Double.parseDouble(sc.nextLine());
        return new Pista(nome,tipo,oraA,oraC,costo);
            
    }
    
    public void stampa(PrintStream p){
        p.println(nome);
        p.println(tipo);
        p.println(oraA);
        p.println(oraC);
        p.println(costo);
    }


}
Poi la classe sciatore:


Codice:
public class Sciatore {
     private String cf,nome,cognome,città,num;
    
    public Sciatore(String cf,String nome,String cognome,String città, String num){
        this.cf=cf;
        this.nome=nome;
        this.cognome=cognome;
        this.città=città;
        this.num=num;
    }


    public String getCf() {
        return cf;
    }


    public String getNome() {
        return nome;
    }


    public String getCognome() {
        return cognome;
    }


    public String getCittà() {
        return città;
    }


    public String getNum() {
        return num;
    }
 public static Sciatore read(Scanner sc){
 String cf,nome,cognome,città,num;
 if(!sc.hasNextLine())return null;
 cf=sc.nextLine();
 if(!sc.hasNextLine())return null;
 nome=sc.nextLine();
 if(!sc.hasNextLine())return null;
 cognome=sc.nextLine();
 if(!sc.hasNextLine())return null;
 città=sc.nextLine();
 if(!sc.hasNextLine())return null;
 num=sc.nextLine();
 return new Sciatore (cf,nome,cognome,città,num);
}
 public void stampa(PrintStream p){
     p.println(cf);
     p.println(nome);
     p.println(cognome);
     p.println(città);
     p.println(num);
 }

Il Problema sorge nella classe Skipass che a quanto ho capito dovrebbe referenziare le altre due solo che non so come fare ne per il costruttore ne per il metodo read, io stavo procedendo cosi ma credo che il procedimento sia del tutto errato :


Codice:
public class Skipass{
     private String codice;
     private Sciatore possessore;
     private Double costo;
     private Pista piste;
     private ArrayList<String>piste;
    
public Skipass (String codice,Double costo,Sciatore possessore, ArrayList<String> piste){
        this.codice=codice;
        this.costo=costo;
        this.possessore=possessore;
        this.piste=piste;
    }


    public Sciatore getPossessore() {
        return possessore;
    }


    public void setPossessore(Sciatore possessore) {
        this.possessore = possessore;
    }


   

	public ArrayList<String> getPiste() {
		return piste;
	}


	public void setPiste(ArrayList<String> piste) {
		this.piste = piste;
	}


    public String getCodice() {
        return codice;
    }


    public Double getCosto() {
        return costo;
    }
public static Skipass read(Scanner sca){
    Scanner sc = null;
    String codice;
    Double costo;
    Sciatore possessore;
    if(!sca.hasNextLine())return null;
    codice=sca.nextLine();
    if(!sca.hasNextLine())return null;
    costo=Double.parseDouble(sca.nextLine());
    if(!sca.hasNextLine())return null;
    ?
    ?
A questo punto mi sono fermato e chiedo gentilmente il vostro aiuto
Grazie in anticipo
 
Ultima modifica:

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Così a occhio, una classe skipass non deve contenere al suo interno un attributo
Pista piste
a parte il fatto che Pista piste così com'è scritto non è un elenco di piste ma UNA pista, semmai dovrebbe essere un insieme di piste
(con un array o una lista tipo List o ArrayList se ti piace di più);
poiché suppongo che i nomi di pista (stringhe) siano tutti distinti, ti basta un elenco di stringhe come
ArrayList<String> piste;
in pratica è una lista di stringhe dove ciascuna stringa rappresenta il nome di una pista acceduta
 
Ultima modifica:

mexexx

Nuovo Utente
4
0
Ciao e grazie mille per la risposta :)
Ho modificato il codice seguendo il tuo consiglio, ma la battaglia si combatte sul campo del metodo read della classe Skipass
Come faccio a fargli leggere il possessore e soprattutto la lista di piste? avevo pensato inoltre di inserire tutto in un while che termini quando la riga letta sia # ci sto provando ma non riesco a venirne fuori, aiutatemi per questo metodo read
 
Ultima modifica:

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Ragiona:
che cos'è uno skipass? è semplicemente una tessera
quando fai una classe devi modellare un oggetto del mondo reale
secondo te una tessera ha può avere come attributo un intero Sciatore? no, basta il codice fiscale del suo possessore (lo sciatore), infatti il file che memorizza gli skipass è fatto proprio in quel modo;
semmai è uno Sciatore a possedere uno Skipass, al più è nella classe Sciatore che devi avere un attributo Skipass, non viceversa
 

mexexx

Nuovo Utente
4
0
Allora farò riferimento allo sciatore per quanto riguarda i metodi del programma solo nel gestore usando una mappa con chiave il cf giusto?
Mentre per leggere i nomi delle piste fino al simbolo # e inserirle in un array ho fatto cosi ma Eclipse protesta a gran voce:
Codice:
public static Skipass read(Scanner sca) throws ParseException, FileNotFoundException{
	String codice;
    double costo;
    String possessore;
    if(!sca.hasNextLine())return null;
    codice=sca.nextLine();
    if(!sca.hasNextLine())return null;
    costo=Double.parseDouble(sca.nextLine());
    if(!sca.hasNextLine())return null;
    possessore = sca.nextLine();
    ArrayList<String> piste = new ArrayList<String>();
	while(!sca.nextLine().equalsIgnoreCase("#")){
		 if(!sca.hasNextLine())return null;
		      piste.add(sca.nextLine());
		}
        
		return new Skipass(codice,costo,possessore,piste);
cosa c'è che non va soprattutto nel while?
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
A quanto ho capito il file skipass.txt ha UNA riga per ogni skipass, suppongo che sarà una cosa del genere:

codice-skipass-01|credito|cod-fiscale-possessore|elenco-piste-skipass-01#
codice-skipass-02|credito|cod-fiscale-possessore|elenco-piste-skipass-02#

codice-skipass-03|credito|cod-fiscale-possessore|elenco-piste-skipass-03#
ecc. ecc.
al posto del carattere "|" ci può essere uno spazio, una virgola, insomma un carattere qualsisai di separazione tra i vari campi
questo significa che dovresti fare un ciclo while dove, leggendo riga per riga, esamini SOLO il primo campo di ogni riga e lo confronti con il codice dello skipass; quando il codice skipass è uguale al primo campo della riga che stai leggendo significa che sei sulla riga giusta dello skipass che devi leggere;
a quel punto devi solo esaminare la singola riga, sapendo che termina con il cancelletto "#" ed inizializzare lo skipass leggendo campo per campo i campi della singola riga, una cosa semplicissima da fare.

Più che "read" la chiamerei costruisciSkipass, in quanto legge un file e ritorna un oggetto Skipass
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!