Ciao.
mi servirebbe una mano sui Comparator.
Se volessi ordinare una List per diversi campi, dovrei fare dei Comparator annidati tra loro? Sommare i risultato di "compareTo" non da l'effetto sperato, specialmente se ci sono numeri.
Esempio:
Classe Articolo che ha String tipo, String nome, Double prezzo
public class Articolo {
private String tipo;
private String nome;
private double prezzo;
....
....
Se volessi ordinare la List di Articolo per tipo DESC, poi nome ASC e infine prezzo ASC, questo codice ovviamente non funziona
ArrayList<Articolo> lista = new ArrayList<>();
lista.add(new Articolo("Libro", "D", 12.25));
lista.add(new Articolo("Libro", "A", 23.86));
lista.add(new Articolo("Penna", "T", 2.69));
lista.add(new Articolo("Penna", "T", 25.12));
lista.add(new Articolo("Penna", "E", 123.86));
Comparator<Articolo> ordZA =
(Articolo a1, Articolo a2) -> a2.getTipo().compareTo(a1.getTipo())
+ a1.getNome().compareTo(a2.getNome())
+ (int)(a1.getPrezzo() - a2.getPrezzo());
Collections.sort(lista, ordZA);
//OPPURE SENZA LAMBDA
Comparator<Articolo> ordAZ = new Comparator<Articolo>() {
@Override
public int compare(Articolo a1, Articolo a2) {
int res = a2.getTipo().compareTo(a1.getTipo());
res += a1.getNome().compareTo(a2.getNome());
res += a1.getPrezzo() - a2.getPrezzo();
return res;
}
};
esce:
Articolo [tipo=Libro, nome=D, prezzo=12.25]
Articolo [tipo=Penna, nome=T, prezzo=2.69]
Articolo [tipo=Libro, nome=A, prezzo=23.86]
Articolo [tipo=Penna, nome=T, prezzo=25.12]
Articolo [tipo=Penna, nome=E, prezzo=123.86]
vorrei la lista ordinata in questo modo (tipo DESC, nome ASC, prezzo ASC, ):
Articolo [tipo=Penna, nome=E, prezzo=123.86]
Articolo [tipo=Penna, nome=T, prezzo=2.69]
Articolo [tipo=Penna, nome=T, prezzo=25.12]
Articolo [tipo=Libro, nome=A, prezzo=23.86]
Articolo [tipo=Libro, nome=D, prezzo=12.25]
Anche perché la differenza tra il prezzo, influisce molto sul risultato dato dal compareTo sulle Stringhe
Come fare?
E' possibile?
Grazie
Tagan