Conta per ogni elemento della lista

di Anonimizzato15991 il
36 risposte

36 Risposte - Pagina 3

  • Ho scritto questo codice:
    
    // Trova massimo per luogo
        public Map<String, Viaggio> getPrezziMassimi() {
            Map<String, Viaggio> risultato = new HashMap<String, Viaggio>();
            Map<String, List<Viaggio>> viaggioPrezzo = getViaggiPrezzi();
            for (String luogo : viaggioPrezzo.keySet()) {
                List<Viaggi> viaggiP = viaggioPrezzo.get(luogo);
                risultato.put(luogo, viaggiP.get(0));
            }
            return risultato;
        }
    
        //calcola per ogni Luogo l'elenco dei pacchetti ordinati per prezzo decrescente
        public Map<String, List<Viaggio>> getViaggiPrezzo() {
            Map<String, List<Viaggio>> risultato = new HashMap<String, List<Viaggio>>();
            for (Viaggio viaggio : listaViaggi) {
                List<Viaggio> viaggioLuogo = risultato.get(viaggio.geLuogo());
                if (viaggioLuogo == null) {
                    viaggioLuogo = new ArrayList<Viaggio>();
                    risultato.put(viaggio.getLuogo(), viaggioLuogo);
                }
                viaggioLuogo.add(viaggio);
            }
            ordinaMappa(risultato)
            return risultato;
        }
    
    private void ordinaMappa(Map<String, List<Viaggio>> mappa) {
            for (List<Viaggio> listaViaggi : mappa.values()) {
                Collections.sort(listaViaggi);
            }
        }
    
    
    Mi sembra che funzioni bene, solo che ho un piccolo problema nell' impostare il mioModelloTabella

    Il mio modello Tabella è questo:
    
        public class ModelloTabellaConta extends AbstractTableModel {
                private Map<String,Integer> mappa;
                private List<String> listaCitta;
    
            public ModelloTabellaConta(Map<String, Integer> mappa) {
                this.mappa = mappa;
                listaCitta = new ArrayList<String>(mappa.keySet());
            }
         
            public int getRowCount() {
                return mappa.size();
            }
    
            public int getColumnCount() {
                return 3;
            }
    
            public Object getValueAt(int r, int c) {
                if (c == 0) {
                   return listaCitta.get(r);
                } else if (c == 1) {
                   return mappa.get(listaCitta.get(r)); // cosa metto qui?
                }elsei fi (c == 2) {
                   return // cosa metto qui?
    
                return null; 
            }
           
                @Override
            public String getColumnName(int c) {
                if (c == 0) {
                    return "Luogo Viaggio";
                }else if (c == 1) {
                    return "Nome Viaggio";
                }else if (c == 2) {
                    retrun "Prezzo Viaggio"
                return null;
            }
    
        }
    
    In poche parole ho la tabella in questo modo:

    Parigi| Nome Viaggio= 7 Giorni e 6 notti Luogo=Parigi Prezzo = 540
    Barlino| Nome Viaggio= Hotel + Visita Luogo=Berlino Prezzo = 350

    Come faccio a mettere quello che voglio in questo modo?

    Parigi | 7 giorni 6 notti| 540
    Berlino| Hotel + Visita | 350

    P.s. ci sarebbe un modo più semplice per fare la stessa cosa senza scrivere i 3 metodi che ho scritto io?
  • CRTVLB ha scritto:


    P.s. ci sarebbe un modo più semplice per fare la stessa cosa senza scrivere i 3 metodi che ho scritto io?
    Sì, tra l'altro non capisco nemmeno bene il senso/utilità di quei metodi per ottenere il "massimo" sui prezzi ....

    Vuoi un Map<String,Viaggio> con gli oggetti Viaggio (uno per luogo) con prezzo massimo?
    public Map<String,Viaggio> getViaggiPrezzoMassimoPerLuoghi() {
        Map<String,Viaggio> mappaViaggiPrezzoMassimo = new HashMap<String,Viaggio>();
    
        for (Viaggio viaggio : listaViaggi) {
            String luogo = viaggio.getLuogoViaggio();
            Viaggio viaggioPrezzoMassimo = mappaViaggiPrezzoMassimo.get(luogo);
           
            if (viaggioPrezzoMassimo == null || viaggio.getPrezzo() > viaggioPrezzoMassimo.getPrezzo()) {
                mappaViaggiPrezzoMassimo.put(luogo, viaggio);
            }
        }
    
        return mappaViaggiPrezzoMassimo;
    }
    Davvero simile al mio precedente (con Integer del prezzo).
  • [quote="andbin"
    Sì, tra l'altro non capisco nemmeno bene il senso/utilità di quei metodi per ottenere il "massimo" sui prezzi ....[/quote]

    La mia idea era quella di oridinare ogni genere per ordine decrescente e poi prelevare il primo elemento di ogni genere.

    Ora mi rimane un ultimo problema, come faccio a mettere i risultati in tabella?

    Il mio modello tabella è sempre quello mio post precedente e non riesco a capire come fare a dirgli che alla 2 colonna va il nome del viaggio e alla terza il prezzo!
  • CRTVLB ha scritto:


    La mia idea era quella di oridinare ogni genere per ordine decrescente e poi prelevare il primo elemento di ogni genere.
    Complicato/contorto, se vuoi solo i viaggi distinti per luogo con prezzo massimo.

    CRTVLB ha scritto:


    Ora mi rimane un ultimo problema, come faccio a mettere i risultati in tabella?

    Il mio modello tabella è sempre quello mio post precedente e non riesco a capire come fare a dirgli che alla 2 colonna va il nome del viaggio e alla terza il prezzo!
    Serve un altro table model, che riceva propriamente un List<Viaggio> o un Map<String,Viaggio> che poi maneggi nella costruzione del model.
  • Riprendo questo post poiché mi sono imbattuto di nuovo in un problema simile.

    Sto esercitandomi su un esercizio che gestisce un campionato di calcio.

    Il campionato è costituito da una serie di squadre ognuna delle quali è rappresentata da un nome e da una città.

    Da un elenco di giornate rappresentate da un numero progressivo, la data e una serie d'incontri.

    Un incontro viene disputato da una squadra di casa e da una in trasferta in un determinato stadio.

    Queste sono le classi del mio progetto:

    // Campionato
    
    public class Campionato {
        
        private List<Squadre> listaSquadre = new ArrayList<Squadre>();
        private List<Giornata> listaGiornate = new ArrayList<Giornata>();
        
        public Campionato() {}
    
        public List<Squadre> getListaSquadre() {
            return listaSquadre;
        }
    
        public List<Giornata> getListaGiornate() {
            return listaGiornate;
        }
    
        public void setListaSquadre(List<Squadre> listaSquadre) {
            this.listaSquadre = listaSquadre;
        }
    
        public void setListaGiornate(List<Giornata> listaGionate) {
            this.listaGiornate = listaGionate;
        }
        
        public void aggiungiSquadra (Squadre s) {
            this.listaSquadre.add(s);
        }
        
        public void aggiungiGiornata (Giornata g) {
            this.listaGiornate.add(g);
        }
        
    }
    
    // Squadre
    public class Squadre {
        
        private String nome;
        private String citta;
        
        public Squadre() {}
        
        public Squadre(String nome, String citta) {
            this.citta = citta;
            this.nome = nome;
        }
    
        public String getNome() {
            return nome;
        }
    
        public String getCitta() {
            return citta;
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
        public void setCitta(String citta) {
            this.citta = citta;
        }
    
        @Override
        public String toString() {
            return nome;
        }
        
        public String toStringClasse() {
            String stringa="";
            stringa += "Nome" + nome +"\n";
            stringa += "Città" + citta;
            return stringa;
        }
    
    // Giornata
    
    public class Giornata {
        
        private String numeroGiornata;
        private Calendar data = new GregorianCalendar();
        private List<Incontri> listaIncontri = new ArrayList<Incontri>();
        
        public Giornata() {}
        
        public Giornata(String numeroGiornata, Calendar data) {
            this.numeroGiornata = numeroGiornata;
            this.data = data;
            data.getTime();
            data.setLenient(false);
        }
    
        public String getNumeroGiornata() {
            return numeroGiornata;
        }
    
        public Calendar getData() {
            return data;
        }
    
        public List<Incontri> getListaIncontri() {
            return listaIncontri;
        }
    
        public void setNumeroGiornata(String numeroGiornata) {
            this.numeroGiornata = numeroGiornata;
        }
    
        public void setData(Calendar data) {
            this.data = data;
        }
    
        public void setListaIncontri(List<Incontri> listaIncontri) {
            this.listaIncontri = listaIncontri;
        }
        
        public void aggiungiIncontro(Incontri incontro) {
            this.listaIncontri.add(incontro);
        }
        
        public Incontri getIncontri(int i) {
            return this.listaIncontri.get(i);
        }
        
        public String toStringData() {
           Date d = data.getTime();
           SimpleDateFormat giorno = new SimpleDateFormat("EEEE dd-MMMM-yyyy"); 
           return giorno.format(d);
         
        }
    
        @Override
        public String toString() {
            return "Giornata{" + "numeroGiornata=" + numeroGiornata + ", data=" + toStringData() + ", listaIncontri=" + listaIncontri + '}';
        }
    
    // incontri
    
    public class Incontri {
        
        private String stadio;
        private Squadre squadraCasa;
        private Squadre squadraTrasferta;
        
        public Incontri() {}
        
        public Incontri(String stadio, Squadre squadraCasa, Squadre squadraTrasferta) {
            this.stadio = stadio;
            this.squadraCasa = squadraCasa;
            this.squadraTrasferta = squadraTrasferta;
        }
    
        public String getStadio() {
            return stadio;
        }
    
        public Squadre getSquadraCasa() {
            return squadraCasa;
        }
    
        public Squadre getSquadraTrasferta() {
            return squadraTrasferta;
        }
    
        public void setStadio(String stadio) {
            this.stadio = stadio;
        }
    
        public void setSquadraCasa(Squadre squadraCasa) {
            this.squadraCasa = squadraCasa;
        }
    
        public void setSquadraTrasferta(Squadre squadraTrasferta) {
            this.squadraTrasferta = squadraTrasferta;
        }
    
        @Override
        public String toString() {
            return "Incontri{" + "stadio=" + stadio + ", squadraCasa=" + squadraCasa + ", squadraTrasferta=" + squadraTrasferta + '}';
        }
    
    Il problema mi si ripresenta quando devo contare quante partite sono state giocate in un determinato stadio

    Ho pensato quindi di scrivere queste linee di codice

    // nella classe Giornata
    
    public Map<String, Integer> getConta() {
            Map<String, Integer> risultato = new HashMap<String, Integer>();
            
                for (Incontro incontro : listaIncontri ) {
                    String stadio = incontro.getStadio();
                    if (risultato.containsKey(stadio)) {
                        Integer vecchioValore = risultato.get(stadio);
                        vecchioValore++;
                        risultato.put(stadio, vecchioValore);
                    } else {
                        risultato.put(stadio, 1);
                    }
                }
            
            return risultato;
        }
    
    e nella JDialog dove visualizzo la tabella:
    
    public void inizializzaTabellaConta() {
            Giornata giornata= (Giornata) this.vista.getModello().getBean(Costanti.GIORNATA);
            
            if ( giornata == null ) {
                
                this.visualizzaFinestraErrore(" Errore inizializzazione Scomparsi----Non è stato possibile inizializzare la Tabella Scomparsi");
            }else{
                logger.info("GIORNATA" + giornata.toString());
                ModelloTabellaStatistiche mts = new ModelloTabellaStatistiche(giornata.conta());
                this.tabellaStatistiche.setModel(mts);
                this.scrollTabellaStatistiche.setViewportView(tabellaStatistiche);
            }
        }
    
    Pensavo che andasse bene ma quando clicco il JButton associato all'azione mi da errore

    "AWT-EventQueue-0" java.lang.NullPointerException

    questo dipende perché giornata nel momento in cui io vorrei visualizzare la tabella ha valore nullo o almeno credo che sia per questo

    Avevo pensato di risolvere aggiungendo al mio campionato una lista di incontri e poi ovviamente scrivere lo stesso metodo nella classe campionato.

    La domanda è l'approccio giusto? Io ho il forte dubbio che non sia così.
  • CRTVLB ha scritto:


    
    public Map<String, Integer> getConta() {
            Map<String, Integer> risultato = new HashMap<String, Integer>();
            
                for (Incontro incontro : listaIncontri ) {
                    String stadio = incontro.getStadio();
                    if (risultato.containsKey(stadio)) {
                        Integer vecchioValore = risultato.get(stadio);
                        vecchioValore++;
                        risultato.put(stadio, vecchioValore);
                    } else {
                        risultato.put(stadio, 1);
                    }
                }
            
            return risultato;
        }
    
    Tecnicamente è corretto. Si può ridurre come ti ho già fatto vedere (e si può fare anche di meglio in tal senso (!), arrivando anche all'uso delle lambda expression di Java 8 ).
    Ma comunque è ok.

    CRTVLB ha scritto:


    Pensavo che andasse bene ma quando clicco il JButton associato all'azione mi da errore

    "AWT-EventQueue-0" java.lang.NullPointerException

    questo dipende perché giornata nel momento in cui io vorrei visualizzare la tabella ha valore nullo o almeno credo che sia per questo
    Verifica bene dove e perché hai il NPE. Non posso saperlo io, ovviamente. Il problema potrebbe essere non tanto il codice in sé ma il quando viene eseguito ...
  • L'errore me lo segnala quando inizializzo tabella alla riga dove scrivo
    
    Giornata giornata= (Giornata) this.vista.getModello().getBean(Costanti.GIORNATA);
    
    ed ovviamente nell'Azione che serve a visualizzare la Tabella alla riga dove chiamo il metodo
    inizializzaTabellaConta();

    ho provato ad aggiungere una lista di Incontri al mio campionato e funziona correttamente, tra l'altro nel codice se la giornata è null dovrebbe restituirmi l'avviso o sbaglio?

    Edit: Sto pensando che tu abbia ragione quando dici che il codice è giusto ma l'errore è quando viene eseguito il codice.

    Faccio un paio di prove e vedo se risolvo.

    P.s. solo per sapere ma aggiungere una lista di incontri al mio campionato è concettualmente sbagliato?
Devi accedere o registrarti per scrivere nel forum
36 risposte