Struttura dati

di il
13 risposte

Struttura dati

Ho una struttura dati come segue:

13 Risposte

  • Re: Struttura dati

    morellik ha scritto:


    Utilizzando questa struttura dovrei creare una pagina html che piu' o meno imiti quella che si vede nel post.
    Dovresti anche precisare (perché può contare) con quale tecnologia viene generata la pagina. Server side (es. JSP)? Client side (es. Angular ecc..)? Altro?

    morellik ha scritto:


    Ho provato con una HashMap<String, HashMap<String, List<String>>> ma non so esattamente come riempirla.
    Attenzione che HashMap è "unordered", ovvero NON c'è un ordine specifico per le chiavi. Se ti interessa garantire l'ordine delle chiavi, HashMap non è appropriato.

    morellik ha scritto:


    In questo modo il secondo put sovrascrive il primo o si somma?
    put a parità di chiave, sovrascrive sempre il valore.

    morellik ha scritto:


    Secondo voi potrebbe essere una struttura dati che funziona o ce ne sono altre migliori?
    Salvo la questione sulla implementazione di Map da usare, di per sé è valido, cioè sarebbe accettabile. Ma bisogna anche vedere come poi la usi (cioè come/da chi viene scansionata tutta questa struttura).

    Altrimenti dovresti modellare il tutto con delle classi, es. classe MacroServizio con attributi: nome (String) e servizi (lista oggetti Servizio), ecc...

    E se devi fare tanti inserimenti da codice, ti conviene "incapsulare" la gestione della struttura per offrire un metodo es.

    public void aggiungiFacility(String macroServizio, String servizio, String... facilities)

    Il metodo cerca il macroServizio (se non c'è lo inserisce), poi cerca il servizio (se non c'è lo inserisce), poi aggiunge alla lista di facility le facilities in argomento.

    Ma si può anche pensare di creare la struttura in modo "fluente" tramite un apposita classe "builder", un uso del tipo:
    Map<String, Map<String, List<String>>> struttura = new StrutturaBuilder()
            .macroCategoria("Macrocategoria 1")
                .servizio("Servizio 1")
                    .facility("Centro1")
                .servizio("Servizio 2")
                    .facility("Centro1")
                    .facility("Centro2")
               // ........
            .build();
    Chiaramente con StrutturaBuilder da fare.
  • Re: Struttura dati

    andbin ha scritto:


    morellik ha scritto:


    Utilizzando questa struttura dovrei creare una pagina html che piu' o meno imiti quella che si vede nel post.
    Dovresti anche precisare (perché può contare) con quale tecnologia viene generata la pagina. Server side (es. JSP)? Client side (es. Angular ecc..)? Altro?
    Uso Play! Framework con templati creati in Scala.
    Attenzione che HashMap è "unordered", ovvero NON c'è un ordine specifico per le chiavi. Se ti interessa garantire l'ordine delle chiavi, HashMap non è appropriato.
    Infatti, la HashMap non andrebbe bene perchè l'ordine è importante.
    Salvo la questione sulla implementazione di Map da usare, di per sé è valido, cioè sarebbe accettabile. Ma bisogna anche vedere come poi la usi (cioè come/da chi viene scansionata tutta questa struttura).

    Altrimenti dovresti modellare il tutto con delle classi, es. classe MacroServizio con attributi: nome (String) e servizi (lista oggetti Servizio), ecc...

    E se devi fare tanti inserimenti da codice, ti conviene "incapsulare" la gestione della struttura per offrire un metodo es.

    public void aggiungiFacility(String macroServizio, String servizio, String... facilities)

    Il metodo cerca il macroServizio (se non c'è lo inserisce), poi cerca il servizio (se non c'è lo inserisce), poi aggiunge alla lista di facility le facilities in argomento.

    Ma si può anche pensare di creare la struttura in modo "fluente" tramite un apposita classe "builder", un uso del tipo:
    Map<String, Map<String, List<String>>> struttura = new StrutturaBuilder()
            .macroCategoria("Macrocategoria 1")
                .servizio("Servizio 1")
                    .facility("Centro1")
                .servizio("Servizio 2")
                    .facility("Centro1")
                    .facility("Centro2")
               // ........
            .build();
    Chiaramente con StrutturaBuilder da fare.
    Questa la vedo un po' complicata per quello che devo fare. I dati non sono tanti e non dovrebbero cambiare nel corso del tempo. L'utente finale non deve modificare niente ma solo fruire dei contenuti.
    Ho 7 macroserivizi e per ognuno ci saranno dai 3 ai 6 servizi. I centri sono in tutto 7 e nessuno fa tutto, per cui sono spalmati in gruppi da 2 o 3 per servizio.

    Una volta stabilito il tipo di contenitore, devo solo passare la variabile al templato e ciclare sul contenuto per creare una struttura a lista.
    Per cui alla fine mi serve una struttura dati facile da gestire e che mantenga l'ordine di inserimento dei dati.
  • Re: Struttura dati

    morellik ha scritto:


    Uso Play! Framework con templati creati in Scala.
    Uhm, non me ne intendo su questo .... ma non è comunque questo la questione principale.

    morellik ha scritto:


    Infatti, la HashMap non andrebbe bene perchè l'ordine è importante.
    Devi solo chiarire se l'ordine deve essere mantenuto in base al contenuto degli oggetti (es. "Paperino" viene prima di "Pippo") o se vuoi dare un ordine sequenziale come vuoi. Nel primo caso TreeMap è ok, nel secondo caso meglio una lista.

    morellik ha scritto:


    Questa la vedo un po' complicata per quello che devo fare. I dati non sono tanti e non dovrebbero cambiare nel corso del tempo. L'utente finale non deve modificare niente ma solo fruire dei contenuti.
    Ho 7 macroserivizi e per ognuno ci saranno dai 3 ai 6 servizi. I centri sono in tutto 7 e nessuno fa tutto, per cui sono spalmati in gruppi da 2 o 3 per servizio.

    Una volta stabilito il tipo di contenitore, devo solo passare la variabile al templato e ciclare sul contenuto per creare una struttura a lista.
    Per cui alla fine mi serve una struttura dati facile da gestire e che mantenga l'ordine di inserimento dei dati.
    Sì ok, il "builder" era solo per dare una idea.

    Mah .. si possono fare diverse valutazioni. Puoi affrontare la cosa con dei TreeMap (se va bene tenere le stringhe ordinate), oppure con delle tue classi.
  • Re: Struttura dati

    Devi solo chiarire se l'ordine deve essere mantenuto in base al contenuto degli oggetti (es. "Paperino" viene prima di "Pippo") o se vuoi dare un ordine sequenziale come vuoi. Nel primo caso TreeMap è ok, nel secondo caso meglio una lista.
    L'ordine dovrebbe essere quello di inserimento, sia per quanto riguarda i macroservizi che i servizi ad essi associati.
    Mah .. si possono fare diverse valutazioni. Puoi affrontare la cosa con dei TreeMap (se va bene tenere le stringhe ordinate), oppure con delle tue classi.
    Darò un'occhiata al TreeMap. Grazie per ora.
  • Re: Struttura dati

    Volendo usare una TreeMap, una struttura per quello che mi serve avrebbe questa inizializzazione?

    private TreeMap<String, List<HashMap<String, List<String>>>> principalServices = new TreeMap<>();
  • Re: Struttura dati

    morellik ha scritto:


    L'ordine dovrebbe essere quello di inserimento, sia per quanto riguarda i macroservizi che i servizi ad essi associati.
    Allora né TreeMap né HashMap vanno bene.
    Puoi vedere LinkedHashMap che è una map ad accesso "veloce" con get ma mantiene l'ordine di inserimento (quindi la iterazione usa questo ordine).

    Forse a questo punto invece di avere una parametrizzazione così complessa, magari è meglio se ragioni più object-oriented.

    Una classe MacroServizio, con nome e lista servizi
    Una classe Servizio, con nome e lista di stringhe

    Poi al livello più "esterno", un List<MacroServizio> et voilà ..
  • Re: Struttura dati

    andbin ha scritto:


    morellik ha scritto:


    L'ordine dovrebbe essere quello di inserimento, sia per quanto riguarda i macroservizi che i servizi ad essi associati.
    Allora né TreeMap né HashMap vanno bene.
    Puoi vedere LinkedHashMap che è una map ad accesso "veloce" con get ma mantiene l'ordine di inserimento (quindi la iterazione usa questo ordine).
    Ora mi faccio un'idea di come usarle.
    Forse a questo punto invece di avere una parametrizzazione così complessa, magari è meglio se ragioni più object-oriented.

    Una classe MacroServizio, con nome e lista servizi
    Una classe Servizio, con nome e lista di stringhe

    Poi al livello più "esterno", un List<MacroServizio> et voilà ..
    Questo mi piacerebbe parecchio, ma mi sfugge che oggetti contengono nomi e liste nelle due classi. Sono entrambi Map?
  • Re: Struttura dati

    morellik ha scritto:


    Questo mi piacerebbe parecchio, ma mi sfugge che oggetti contengono nomi e liste nelle due classi. Sono entrambi Map?
    Molto banalmente:
    public class MacroServizio {
        private String nome;
        private List<Servizio> servizi;
    
        // getter/setter ecc...
    }
    
    public class Servizio {
        private String nome;
        private List<String> facilities;
    
        // getter/setter ecc...
    }
    Poi semplicemente tratti un List<MacroServizio> o se vuoi incapsulare ulteriormente (può essere utile per certi motivi):
    public class StrutturaServizi {
        private List<MacroServizio> macroServizi;
    
        // getter/setter ecc...
    }
  • Re: Struttura dati

    andbin ha scritto:


    morellik ha scritto:


    Questo mi piacerebbe parecchio, ma mi sfugge che oggetti contengono nomi e liste nelle due classi. Sono entrambi Map?
    Molto banalmente:
    public class MacroServizio {
        private String nome;
        private List<Servizio> servizi;
    
        // getter/setter ecc...
    }
    
    public class Servizio {
        private String nome;
        private List<String> facilities;
    
        // getter/setter ecc...
    }
    Poi semplicemente tratti un List<MacroServizio> o se vuoi incapsulare ulteriormente (può essere utile per certi motivi):
    public class StrutturaServizi {
        private List<MacroServizio> macroServizi;
    
        // getter/setter ecc...
    }
    Scusa sono cocciuto come una capra (senza offesa alla capra) ma proprio non mi entra nella capoccia. Sto provando ma non ci levo le gambe,
    
    public class MacroService {
        private String name;
        private List<Service> service;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public List<Service> getService() {
            return service;
        }
    
        public void setService(List<Service> service) {
            this.service = service;
        }
    }
    
    
    public class Service {
        private String name;
        private List<String> facilities;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public List<String> getFacilities() {
            return facilities;
        }
    
        public void setFacilities(List<String> facilities) {
            this.facilities = facilities;
        }
    }
    
    
    public class ServiceStructure {
         private List<MacroService> macroServices;
    
        public ServiceStructure() {
            fillMacroServices();
        }
    
        private void fillMacroServices() {
            MacroService macroService = new MacroService();
            Service service = new Service();
            List<Service> services = new ArrayList<>();
            service.setName("Solid-state NMR");
            service.setFacilities(Arrays.asList(new String[]{"CERM/CIRMMP"}));
            services.add(service);
            service.setName("Solution NMR");
            service.setFacilities(Arrays.asList(new String[]{"CERM/CIRMMP"}));
            services.add(service);
            service.setName("EPR");
            service.setFacilities(Arrays.asList(new String[]{"CERM/CIRMMP"}));
            services.add(service);
            service.setName("Relaxometry");
            service.setFacilities(Arrays.asList(new String[]{"CERM/CIRMMP"}));
            services.add(service);
            macroService.setName("NMR");
            macroService.setService(services);
    
            macroServices.add(macroService);
    
        }
        public List<MacroService> getMacroServices() {
            return macroServices;
        }
    
        public void setMacroServices(List<MacroService> macroServices) {
            this.macroServices = macroServices;
        }
    }
    
    Provo a mettere tutto insieme:
    
    ServiceStructure serviceStructure = new ServiceStructure();
    List<MacroService> macroServices = serviceStructure.getMacroServices();
    System.out.println(macroServices.isEmpty());
    
    mi dà un bel Null Pointer exception. Dov'è che sto smarronando alla grande?
  • Re: Struttura dati

    Intanto ho risolto il Null Pointer Exception.
  • Re: Struttura dati

    Possibile che debba scrivere tutto sto codice solo per un Macroservizio?
    Mi sfugge sicuramente qualcosa.
    
     private void fillMacroServices() {
            macroServices = new ArrayList<>();
            MacroService macroService = new MacroService();
            Service service = new Service();
            List<Service> services = new ArrayList<>();
            service.setName("Solid-state NMR");
            service.setFacilities(Arrays.asList(new String[]{"CERM/CIRMMP"}));
            services.add(service);
            service = new Service();
            service.setName("Solution NMR");
            service.setFacilities(Arrays.asList(new String[]{"CERM/CIRMMP"}));
            services.add(service);
            service = new Service();
            service.setName("EPR");
            service.setFacilities(Arrays.asList(new String[]{"CERM/CIRMMP"}));
            services.add(service);
            service = new Service();
            service.setName("Relaxometry");
            service.setFacilities(Arrays.asList(new String[]{"CERM/CIRMMP"}));
            services.add(service);
            System.out.println(services.get(1).getName());
            macroService.setName("NMR");
            macroService.setService(services);
            macroServices.add(macroService);
    
        }
    
  • Re: Struttura dati

    morellik ha scritto:


    Possibile che debba scrivere tutto sto codice solo per un Macroservizio?
    Mi sfugge sicuramente qualcosa.
    Beh diverse cose si possono ottimizzare:
    - al costruttore di MacroService puoi già passare il nome
    - al costruttore di Service puoi già passare il nome (e magari anche farlo varargs per passare N facility)
    - al asList non serve che crei un array ... asList è un "varargs"
    - in Service puoi anche mettere una versione di setFacilities che è un varargs

    Insomma, i modi per compattare un po' ci sono ...
  • Re: Struttura dati

    La soluzione object oriented mi piaceva parecchio, ma per i pochi dati che ho è troppo prolissa. Alla fine ho seguito il tuo suggerimento ed ho usato una LinkedHashMap che funziona egregia. Quattro for nel template e mostro tutto.
    Grazie ancora.
Devi accedere o registrarti per scrivere nel forum
13 risposte