PDA

View Full Version : [JAVA] Ordinare mappa mediante comparator scelto da me


Kurogane
25-09-2006, 13:48
Salve, vorrei realizzare una mappa di denari ordinata secondo un mio criterio, cioè dalla moneta con valore + grande a quella con valore più piccolo. Pensavo di usare

dove c'è il metodo di aggiungi, dopo aver fatto lista.put(d);
Collections.sort(lista, cmp);

inoltre la classe cmp
class cmp implements Comparator{

public int compare(Object o1, Object o2){
Denaro d1=(Denaro) o1;
Denaro d2=(Denaro) o2;

if((d2.getValore() - d1.getValore()) < 0)
return -1;

if((d2.getValore() - d1.getValore()) == 0)
return 0;

return 1;
}
}

solo che non funziona xkè risulta che tale metodo non è presente in Collections :confused: dove sbaglio?

Andrea16v
25-09-2006, 14:20
In attesa di qualcuno che ci capisce veramente, io ti dico che a me non piace il
"Collections.sort(lista, cmp);"
io di solito uso una cosa del tipo:
"Collections.sort(lista, new cmp());", dove cmp è una classe con il proprio CompareTo.

Prendi tutto con le pinze, e con i guanti... :D

Mixmar
25-09-2006, 19:35
In attesa di qualcuno che ci capisce veramente, io ti dico che a me non piace il
"Collections.sort(lista, cmp);"
io di solito uso una cosa del tipo:
"Collections.sort(lista, new cmp());", dove cmp è una classe con il proprio CompareTo.

Prendi tutto con le pinze, e con i guanti... :D

Penso che Andrea16v ci abbia visto giusto: il compilatore ti avvisa che il metodo non è presente, perchè ai suoi occhi stai cercando di chiamare il metodo:


Collections.sort(List, Class);


mentre lui si aspetta un


Collections.sort(List, Comparator);


cioè, stai passando una classe al posto di una istanza.

Comunque, non so se sono io "quello che ci capisce"... :D

Kurogane
26-09-2006, 04:37
come dovrei scrivere per creare un metodo comparator?

PGI-Bis
26-09-2006, 11:04
Mantenendo il codice che hai scritto:

Collections.sort(lista, new cmp());

Andrea16v
26-09-2006, 11:10
come dovrei scrivere per creare un metodo comparator?

Te l'ho scritto sopra, devi cambiare l'istruzione di ordinamento che hai messo te con:
Collections.sort(lista, new cmp());

così a occhio non ci sono altre modifiche da fare, fai una prova.. :)

Kurogane
26-09-2006, 15:49
ma io l'ho fatto, ma mi da quest'errore:
D:\poo\app260706\SoldiMap.java:29: cannot find symbol
symbol : method sort(java.util.Map<java.lang.Double,poo.app260706.Denaro>,poo.app260706.SoldiMap.cmp)
location: class java.util.Collections
Collections.sort(lista, new cmp());
^

PGI-Bis
26-09-2006, 16:05
Se "lista" è una lista (List, figli & nipoti) è un paio di maniche.
Se "lista" è una mappa (Map, figli & nipoti) è un'altro paio di maniche (anzi parliamo proprio di un'altra camicia).

Il compilatore, che è un chiacchierone, ci dice che "lista" è una mappa. Le chiavi sono Double e i valori sono Denari.

Se nell'elemento E(K, V) della mappa la chiave K è il valore della moneta V puoi ottenere il risultato che cerchi usando la classe cmp che hai creato (cioè un comparator) e, anzichè Collections.sort, dire:

Comparator<Double> cmp = new Comparator<Double>() {
public int compareTo(Double a, Double b) {
//eccetera
}
};
Map<Double, Denaro> sortedMap = new TreeMap<Double, Denaro>(cmp);
sortedMap.putAll(lista);

sortedMap conterrà a tutto quello che c'era in lista ma ordinato per chiave, secondo quanto imposto dal Comparator cmp.

porfax
27-09-2006, 16:45
Per ordinare le mappe con il comparator, conviene farsi restituire il keyset e poi richiamare il collections.sort(keyset, new comparator())

PGI-Bis
27-09-2006, 17:03
Però il risultato non è una mappa ordinata.

Angus
27-09-2006, 17:25
Non puoi usare TreeMap (http://java.sun.com/j2se/1.5.0/docs/api/java/util/TreeMap.html)?

PGI-Bis
27-09-2006, 17:32
Io mi sono perso. Ordiniamo una mappa, scorriamo in modo ordinato il contenuto di una mappa, creiamo una mappa ordinata o mappiamo una lista? :D

Kurogane
27-09-2006, 17:35
una precisazione: la mappa deve essere ordinata dal denaro più grande a quello + piccolo. Si poteva anche usare una treemap, vero, ma entrambe usano l'ordine naturale. La domanda è, come cavolo faccio a inserire nell'ordine che voglio io?

Angus
27-09-2006, 17:42
una precisazione: la mappa deve essere ordinata dal denaro più grande a quello + piccolo. Si poteva anche usare una treemap, vero, ma entrambe usano l'ordine naturale. La domanda è, come cavolo faccio a inserire nell'ordine che voglio io?

usa il costruttore public TreeMap(Comparator<? super K> c) (http://java.sun.com/j2se/1.5.0/docs/api/java/util/TreeMap.html#TreeMap(java.util.Comparator))