Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    10

    Java TreeSet, visualizzare a schermo un Treeset ordinato in base a un parametro differente

    Salve a tutti, sto studiando Java per un esame universitario e ho alcuni dubbi sull'utilizzo dei Treeset, un particolare esercizio chiede di scegliere un contenitore adatto per contenere un dato di tipo Prodotto caratterizzato dai parametri ID e Price che abbia ID univoci tenendo conto che l'operazione più frequente è la stampa ordinata per prezzo.
    Per avere l'univocità ho scelto un TreeSet e ho implementato l'interfaccia comparable necessaria per questo tipo di contenitore.
    Ora il problema è che comparable fornisce solo un metodo di comparazione che popola di elementi univoci il Set e lo ordina secondo il parametro scelto.

    Il quesito chiede di organizzare i dati in due classi separate di mio ho fatto così:
    codice:
    public class Prodotto implements Comparable<Prodotto> {    
        private Double price; 
        private Integer id;
        
        
        public Prodotto(double price, int id)
        {
            this.price=price;
            this.id=id;
        }
        
        
         
        
        public int compareTo(Prodotto p)
        {
            return this.id.compareTo(p.id);
        }
        
         
        
        public String toString()
        {
            String s= new String ("prodotto"+price+"id"+id);
            return s;
        }
        
        public class PriceComp implements Comparator<Prodotto>
        {
            public int compare(Prodotto a,Prodotto b)
            {
                return a.price.compareTo(b.price);
            }
        }
        
        public class IdComp implements Comparator<Prodotto>
        {
            public int compare(Prodotto a,Prodotto b)
            {
                return a.id.compareTo(b.id);
            }
        }
    codice:
    public class Contenitore {
    
        TreeSet<Prodotto> set;
    
    
        public Contenitore(){
            //this.set = new TreeSet<Prodotto>();
        }
    
    
        public static void main(String[] args) {
            Prodotto a = new Prodotto(345.2, 45);
            Prodotto b = new Prodotto(745.2, 45);
            Prodotto c = new Prodotto(945.2, 45);
            Prodotto d = new Prodotto(345.2, 55);
            Prodotto e = new Prodotto(845.2, 45);
    
    
            Contenitore g = new Contenitore();
            g.set=new TreeSet<Prodotto>(); 
            g.set.add(a);
            g.set.add(b);
            g.set.add(c);
            g.set.add(d);
            g.set.add(e);
    
                    g.set=new TreeSet<Prodotto>(new PriceComp()); //da errore
    
    
            
            
        }
    
    
    }
    Ho pensato che potessi definire un nuovo comparatore per ordinare il set secondo il parametro prezzo per poi stamparlo, ma purtroppo il metodo non viene riconosciuto dalla classe contenitore. Come potrei fare dunque a stampare a video il TreeSet che contiene ID univoci ma ordinato per prezzo?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Nasio91 Visualizza il messaggio
    codice:
    g.set=new TreeSet<Prodotto>(new PriceComp()); //da errore
    Dà errore ma solo per un motivo: le classi PriceComp e IdComp le hai definite come "inner class", sono dentro Prodotto e non sono marcate static. Questo le rende appunto classi "inner" per cui per istanziarle devi avere prima una istanza della classe "contenitore" poi invocare il new della inner class su quella istanza.

    In sostanza:
    - o lasci le due classi dove sono e le marchi static. Così diventano delle "nested" (static) class. Ma altrove le devi istanziare come new Prodotto.PriceComp()
    - o le sposti FUORI da Prodotto, come normali classi "top level".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2016
    Messaggi
    10
    Ho provato a dichiarare il nuovo comparatore come nested class nella classe Contenitore
    codice:
    public class Contenitore {
    
        TreeSet<Prodotto> set;
    
    
        public Contenitore() {
             this.set = new TreeSet<Prodotto>();
        }
    
    
        public static  class PriceComp implements Comparator<Prodotto> {
            public int compare(Prodotto a, Prodotto b) {
                return a.price.compareTo(b.price);
            }
        }
        
        
        public static void  stampacollezione(TreeSet<Prodotto> set)
        {
            set=new TreeSet<Prodotto>(new PriceComp());
            for(Prodotto t:set)
            {
                System.out.println(t.toString());
            }
            
            
        }
        
        public static void stampa(TreeSet<Prodotto> set)
        {
            for(Prodotto t:set)
            {
                System.out.println(t.toString());
            }
        }
    
    
        public static void main(String[] args) {
            Prodotto a = new Prodotto(345.2, 45);
            Prodotto b = new Prodotto(745.2, 45);
            Prodotto c = new Prodotto(945.2, 45);
            Prodotto d = new Prodotto(345.2, 55);
            Prodotto e = new Prodotto(845.2, 45);
    
    
            Contenitore g = new Contenitore();
            // g.set=new TreeSet<Prodotto>();
            g.set.add(a);
            g.set.add(b);
            g.set.add(c);
            g.set.add(d);
            g.set.add(e);
    
    
            stampacollezione(g.set);
    
    
            stampa(g.set);
        
                    
        }
    
    
    }
    ho dichiarato static la classe PriceComp nel Contenitore e non ci sono errori di compliazione,
    ma stranamente la stampa della collezione ordinata per prezzo non avviene al contrario di quella standard ordinata per ID mediante comparable...
    Ultima modifica di Nasio91; 13-07-2018 a 15:09

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Nasio91 Visualizza il messaggio
    codice:
        public static void  stampacollezione(TreeSet<Prodotto> set)
        {
            set=new TreeSet<Prodotto>(new PriceComp());
            for(Prodotto t:set)
            {
                System.out.println(t.toString());
            }
        }
    stampacollezione riceve il TreeSet popolato (ordinato per ID). Poi al parametro set assegni un nuovo TreeSet, che è inizialmente (e resta) VUOTO, solo configurato per avere il criterio dato da PriceComp.
    Ultima modifica di andbin; 14-07-2018 a 10:20
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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