Sto impazzendo, volevo ordinare una TreeMap per valore e non per chiave... qualcuno potrebbe aiutarmi![]()
grazie, ciao![]()
Sto impazzendo, volevo ordinare una TreeMap per valore e non per chiave... qualcuno potrebbe aiutarmi![]()
grazie, ciao![]()
Ti serve una struttura di tipo map? Cioe' devi anche accedere ai valori per chiave oltre che averli ordinati? Se la risposta e' no usa TreeSet e non TreeMap.
Se ti serve una mappa, ma non ti serve di ordinarla per chiave, puoi anche non usare una TreeMap e optare per un HashMap che generalmente e' piu' veloce.
Per l'ordinamento: il metodo values() su qualunque map restituisce una Collection contenente tutti i valori, una volta ottenuta la Collection. la puoi ordinare attraverso il metodo Collections.sort. Qui puoi seguire due strade, ordine naturale (cioe' quello di default oppure quello che decidi tu facendo estendere alla classe Comparable e sovrascrivendo opportunamente il metodo CompareTo) oppure attraverso una tua classe che implementa l'interfaccia Comparator.
codice:Map mappa = new HashMap() //O TreeMap se preferisci //ALTRO CODICE Collection collezione = mappa.values(); Collections.sort(collezione); //Secondo ordine naturale;P.s. Non so se esistono metodi piu' furbi, questo comunque dovrebbe andare.codice:Map mappa = new HashMap() //O TreeMap se preferisci //ALTRO CODICE Collection collezione = mappa.values(); Comparator c = new tuoComparator(); Collections.sort(collezione, c); //Secondo Comparator;
Purtroppo ho bisogno delle chiavi... quello che devo realizzare in poche parole è una classifica Nome, Punteggio e devo ordinare i partecipanti per punteggio.
Avevo pensato di memorizzarli in una
codice:
Map<String, Integer>
consigli su come ordinarli per valore
Ok, ho capito lo scenario. Purtroppo nelle Api non ho trovato nulla che fa al caso tuo.
Se accetti un po' di ridondanza, posso proporti due soluzioni.
Soluzione 1) La Map diventa cosi' tipizzata
Map<String, Partecipante> dove String e' il nome e Partecipante e' un oggetto contenete nome e punteggio, quest'ultimo estende Comparable e nel metodo compareTo, richiama il metodo CompareTo del Integer della prima classe passandogli l'Integer della seconda.
Hai una mappa e quando ti serve la lista ordinata fai come ho scritto sopra (Ottieni la Collection e fai il sort()). L'inconveniente e' che computazionalmente devi riordinare ogni volta.
Soluzione 2) Ti scrivi una classe che estende una HashMap e all'inteno ci metti anche un TreeSet privato che conterra' i valori, sovrascrivi i costruttori e metodi clear, clone, put, putAll e remove in modo che chiamino il metodo della superclasse e facciano l'operazione anche sul TreeSet, infine sovrascrivi il metodo values() perche' ti restituisca il TreeSet(che dovrebbe essere ordinato). Hai una struttura dati in piu' che resta nascosta al livello superiore, i cui elementi puntano agli stessi oggetti puntati dai valori della HashMap. Nel codice poi usi la tua "OrderedByValuesHashMap" in maniera normale e quando ti serve la lista dei valori, chiami il metodo values().
i tuoi dati vengono prelevati da un DB? In questo caso ti fai l'ordinamento tramite la query e poi per memorizzare le coppie chiave-valore, puoi utilizzare questa classe che implementa una Hashtable ordinata così come vengono inseriti gli elementi.
Al mio segnale... scatenate l'inferno!
Oppure la LinkedHashMap presente nel JRE. E' praticamente analoga alla classe che ha proposto R@ve tranne che permette null come chiave e non e' sincronizzata (quindi leggermente piu' efficente, ma inadatta ad accessi concorrenti).
![]()