Conta per ogni elemento della lista

di il
36 risposte

36 Risposte - Pagina 3

  • Re: Conta per ogni elemento della lista

    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?
  • Re: Conta per ogni elemento della lista

    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).
  • Re: Conta per ogni elemento della lista

    [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!
  • Re: Conta per ogni elemento della lista

    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.
  • Re: Conta per ogni elemento della lista

    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ì.
  • Re: Conta per ogni elemento della lista

    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 ...
  • Re: Conta per ogni elemento della lista

    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