Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Programmazione JAVA

  1. #1

    Programmazione JAVA

    Salve a tutti! Sto preparando un'esame di programmazione in java. Il problema che ho incontrato risiede in una traccia di esame la quale mi chiede di gestire i veicoli in una concessionaria. Tale traccia prevede che ci sia una classe "Veicoli" che, "deve prevedere un ordinamento per le sue istanze basato sull'efficienza" (per questo avevo pensato ad un comparatore). In seguito in un'altra classa chiamata "Concessonario" la quale contine l'elenco dei veicoli, e' presente la seguente richiesta: "ciclare tramite for-each gli elementi dell'elenco in ordine di efficienza". Il mio problema risiede proprio nell'interpretazione di tale richiesta (premetto che non ho problemi sull'utilizzo del for-each). So che puo' sembrare una richiesta stupida agli occhi di una community molto preparata, tuttavia se potreste darmi una mano ve ne sarei grato. Grazie dell'attenzione.

  2. #2
    Quote Originariamente inviata da VinSmoke Visualizza il messaggio
    Il mio problema risiede proprio nell'interpretazione di tale richiesta (premetto che non ho problemi sull'utilizzo del for-each).
    Innanzitutto mostra un po' del codice che hai scritto, giusto per capire a che punto sei e se è corretto. Poi dovresti precisare (perché non si è capito) dove va usato quel "for-each", se all'interno di Concessonario o se dall'esterno e in tal caso ad esempio se è Concessonario a dover essere Iterable oppure no.
    AndreaSenior Java developerSCJP 5 (91%) – SCWCD 5 (94%)
    Il mio nuovo sito-blog italiano sulla programmazione: andbin.it

  3. #3
    codice:
    ===================================================================================
    /** 
      * VEICOLI: i quali sono caratterizzati da marca, modello e da un metodo per la stampa di un
      indicatore di efficienza del veicolo. L’implementazione di tale metodo non è nota a priori, in
      quanto varierà in base al veicolo specifico. La classe deve prevedere un ordinamento per le sue
      istanze basato sull’efficienza (i veicoli di efficienza maggiore vengono prima).
      */
    
    public abstract class Veicolo {
    
     
     private String marca, modello;
     public abstract double getEfficienza();
     public Veicolo(String marca, String modello) {
      this.marca = marca;
      this.modello = modello;
     }
     
     public static Comparator<Object> getVeicoliOrdering(){
      return new VeicoliComparator();
     }
     public String getMarca() {
      return marca;
     }
     public String getModello() {
      return modello;
     }
    }
    
    ====================================================================================
     /**
      * CONCESSIONARIO: caratterizzato da nome, indirizzo e dall’elenco dei veicoli in pronta consegna. 
       Essa permette di:
      a. Aggiungere un veicolo;
      b. Rimuovere un veicolo;
      c. Dato un veicolo, restituire l’elenco dei veicoli della stessa tipologia;
      d. Ciclare sui veicoli tramite for-each, in ordine di efficienza.
      */
    
    
    public class Concessionario {
     
     private String nome, indirizzo;
     private List<Veicolo> elencoVeicoli;
     public Concessionario(String nome, String indirizzo) {
      this.nome = nome;
      this.indirizzo = indirizzo;
      elencoVeicoli = new ArrayList<>();
     }
     
     public String getNome() {
      return nome;
     }
     public String getIndirizzo() {
      return indirizzo;
     }
     //a. Aggiungere un veicolo;
     public void addVeicolo(Veicolo v) {
      if (v.equals(null)) {
       throw new NullPointerException();
      } else {
       elencoVeicoli.add(v);
      }
     }
     //b. Rimuovere un veicolo;
     public void removeVeicolo(Veicolo v) throws VeicoloNonPresenteException {
      if (elencoVeicoli.contains(v)) {
       throw new VeicoloNonPresenteException();
      } else if (v.equals(null)) {
       throw new NullPointerException();
      } else {
       elencoVeicoli.remove(v);
      }
     }
     
     //c. Dato un veicolo, restituire l’elenco dei veicoli della stessa tipologia;
     public List<Veicolo> getVeicoliUgualeTipologia(Veicolo v) {
      List<Veicolo> listaVeicoli = new ArrayList<>();
      if (v.equals(null)) {
       throw new NullPointerException();
      } else {
       for (Veicolo veicolo : elencoVeicoli) {
        if (veicolo.getClass().equals(v.getClass())) {
         listaVeicoli.add(veicolo);
        }
       }
      }
      return listaVeicoli;
     }
     //d. Ciclare sui veicoli tramite for-each, in ordine di efficienza.
     public void cicla(){
      
     }
    }
    Ultima modifica di LeleFT; 28-08-2017 a 13:10 Motivo: Aggiunti i tag CODE

  4. #4
    Ci sono alcune cose inappropriate e che non vanno.

    1) Non è di per sé sbagliato avere quel metodo statico che fornisce il VeicoliComparator (sebbene non ce n'è davvero bisogno). La cosa che non va è la parametrizzazione ad Object in Comparator<Object> . Come minimo avrebbe più senso Comparator<Veicolo>

    2) v.equals(null) NON ha senso. Restituisce sempre false, è una specifica di equals! Se vuoi testare per uguale a null, allora v == null


    Riguardo il cicla(), la questione richiede delle scelte. La lista elencoVeicoli non è già ordinata per efficienza. Con il addVeicolo puoi aggiungere veicoli nell'ordine che ti pare e quest'ordine è poi quello nella lista.
    Ora:
    a) nel cicla() fai una copia della lista (così non tocchi quella di Concessionario), ordini la lista-copia per efficienza e quindi la scorri con il for-each

    oppure

    b) La lista elencoVeicoli di Concessionario la tieni e mantieni ordinata per efficienza ad ogni veicolo aggiunto, tramite il concetto del "binary search". Così la lista è già ordinata e in cicla() la scorri subito.
    AndreaSenior Java developerSCJP 5 (91%) – SCWCD 5 (94%)
    Il mio nuovo sito-blog italiano sulla programmazione: andbin.it

  5. #5
    Ciao ! La tua traccia mi ricorda molto la stessa che mi è capitata durante il mio esame di programmazione Java e guarda caso ho il codice corretto che ti serve.

    codice:
    public class Concessionario implements Iterable<Veicolo> {
    
    
        String nome, indirizzo;
        
        // TODO perchè una lista?
        List<Veicolo> listaVeicoli = new ArrayList<Veicolo>();
        
        public void addVeicolo(Veicolo mezzoDaAggiungere){
            listaVeicoli.add(mezzoDaAggiungere);
        }
        
        public void removeVeicolo(Veicolo veicoloDaRimuovere){
            listaVeicoli.remove(veicoloDaRimuovere);
        }
        
        // TODO si poteva fare con il getClass()
        public List<Veicolo> getByTipology(Veicolo veicoloCampione){
            
            List<Veicolo> listaStessaTipologia = new ArrayList<Veicolo>();
            
            for(Veicolo veicoloInEsame : listaVeicoli){
                
                if(veicoloCampione instanceof Automobile && veicoloInEsame instanceof Automobile){
                    listaStessaTipologia.add(veicoloInEsame);
                }else if(veicoloCampione instanceof Bicicletta && veicoloInEsame instanceof Bicicletta){
                    listaStessaTipologia.add(veicoloInEsame);
                }else if(veicoloCampione instanceof AutomobileFutura && veicoloInEsame instanceof AutomobileFutura){    //<- controllare se funge con un semplice else ! (per ottimizzare)
                    listaStessaTipologia.add(veicoloInEsame);
                }
                
            }    
            
            return listaStessaTipologia;
    
    
        }
    
    
        @Override
        public Iterator<Veicolo> iterator() {
            // TODO non era necessario il new Veicolo().
            Collections.sort(listaVeicoli, new Veicolo());    
            return listaVeicoli.iterator();
        }
    }

    Come vedi i commenti in TODO sono di correzione da parte del mio prof che effettivamente ci stanno.. Non ricordo bene il senso del primo TODO "Perchè una lista" ma credo si riferisse al List come tipo che poteva tranquillamente essere sostituito da un ArrayList..
    Il resto è abbastanza chiaro..

    Ecco anche la classe Veicolo

    codice:
    /**
     * 
     */
    package libreria;
    
    
    import java.util.Comparator;
    
    
    /**
     * @author studente
     *
     */
    
    
    public abstract class Veicolo implements Comparator<Veicolo> {
    
    
        String marca, modello;
    
    
        public abstract Number getEfficienza(){
            return null;
        }
        
        public String getMarca(){
            return marca;
        }
        
        public String getModello(){
            return modello;
        }
        
        Veicolo(String marcaInput, String modelloInput){
            marca     = marcaInput;
            modello    = modelloInput;
        }
    
    
        public Veicolo() {}
    
    
        @Override
        public int compare(Veicolo veicoloPrimo, Veicolo veicoloSecondo) {
    
    
            if(veicoloPrimo.getEfficienza().floatValue() > veicoloSecondo.getEfficienza().floatValue()){
                return -1;
            }else if(veicoloPrimo.getEfficienza().floatValue() == veicoloSecondo.getEfficienza().floatValue()){
                return 0;
            }else{
                return 1;
            }
    
    
        }
        
        @Override
        public String toString(){
            return "Veicolo:" + getMarca() + "(" + getModello() + ") > " + getEfficienza();
        }
    }
    Ultima modifica di LeleFT; 28-08-2017 a 13:10 Motivo: Aggiunti i tag CODE

  6. #6
    Quote Originariamente inviata da SkyBlue Visualizza il messaggio
    guarda caso ho il codice corretto che ti serve.
    Innanzitutto dare agli altri le soluzioni non è una buona cosa .... darle poi sbagliate è ancora più brutto. La cosa, tra le altre, peggiore nel tuo codice è la implementazione del Comparator in Veicolo.
    Ma finché trovi prof. che ti fanno "passare" queste soluzioni ... sei a cavallo ...
    AndreaSenior Java developerSCJP 5 (91%) – SCWCD 5 (94%)
    Il mio nuovo sito-blog italiano sulla programmazione: andbin.it

  7. #7
    Mhm interessante, mi diresti perchè ti turba l'implementazione del comparator nella classe Veicolo ? A me onestamente pare sensata, ma è giusto conoscere più punti di vista.
    Per quanto riguarda l'aver allegato "la soluzione", ho preferito farlo solo perchè il codice era già fatto. La mia è stata solo una variante per uno stesso problema.

  8. #8
    Quote Originariamente inviata da SkyBlue Visualizza il messaggio
    mi diresti perchè ti turba l'implementazione del comparator nella classe Veicolo ?
    A me onestamente pare sensata
    No, non è sensata.

    In Java la comparazione degli oggetti è stata affrontata tramite l'utilizzo di due interfacce distinte: Comparable e Comparator.

    Comparable va implementato nella classe degli oggetti da comparare. Se hai una classe es. Persona, questa può implementare

    public class Persona implements Comparable<Persona>

    Essendo nella classe degli oggetti da comparare, la implementazione di Comparable è UNA sola, non ce ne possono essere ovviamente di più (una interfaccia si implementa una volta sola in un oggetto). Il criterio di ordinamento è quindi solo uno e come dice la documentazione, dovrebbe (in teoria) essere l'ordinamento che è più "naturale" per quella classe di oggetti (ma poi dipende dal concetto della classe, ovviamente). Nel caso di un Persona, l'ordinamento naturale più ovvio e comune è per cognome/nome.

    Il compareTo di Comparable DEVE usare lo "stato" dell'oggetto, perché la comparazione è tra l'oggetto this e un altro oggetto (in argomento al metodo).


    Comparator invece va implementato in classi DISTINTE da quella degli oggetti da comparare. Essendo in classi distinte, se ne possono avere quante ne vuoi e quindi ottenere N criteri "extra" di ordinamento.

    public class AnnoNascitaDecrescenteComparator implements Comparator<Persona>
    public class NomeEAnnoNascitaComparator implements Comparator<Persona>
    ecc....

    Il compare di Comparator riceve i 2 oggetti da comparare, NON ha senso che sia implementato nella classe degli oggetti, perché non userebbe lo "stato" dell'oggetto su cui compare viene invocato! E infatti nel tuo caso hai dovuto passare un nuovo Veicolo fittizio al sort che però concettualmente non servirebbe a un piffero.


    Questo è quanto va studiato. Stop.
    Ultima modifica di andbin; 18-08-2017 a 18:08
    AndreaSenior Java developerSCJP 5 (91%) – SCWCD 5 (94%)
    Il mio nuovo sito-blog italiano sulla programmazione: andbin.it

  9. #9
    Si sono d'accordissimo con tutto quello che hai scritto, è stata una mia distrazione non soffermarmi bene sul codice.

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 © 2020 vBulletin Solutions, Inc. All rights reserved.