(à partir de la Maison de Code)
Malpropre et alambiqué: le Tri à la main
Collections.sort(pizzas, new Comparator<Pizza>() {
@Override
public int compare(Pizza p1, Pizza p2) {
int sizeCmp = p1.size.compareTo(p2.size);
if (sizeCmp != 0) {
return sizeCmp;
}
int nrOfToppingsCmp = p1.nrOfToppings.compareTo(p2.nrOfToppings);
if (nrOfToppingsCmp != 0) {
return nrOfToppingsCmp;
}
return p1.name.compareTo(p2.name);
}
});
Cela nécessite beaucoup de dactylographie, de l'entretien et est sujette aux erreurs.
L'réfléchie: Tri avec BeanComparator
Collections.sort(pizzas, new BeanComparator("size", new BeanComparator("nrOfToppings", new BeanComparator("name"))));
Évidemment, ce n'est plus concis, mais encore plus les risques d'erreurs que vous perdez votre référence directe à la champs à l'aide des Cordes à la place. Maintenant, si un champ est renommé, le compilateur n'a même pas de signaler un problème. En outre, parce que cette solution utilise la réflexion, le tri est beaucoup plus lent.
Comment y arriver: Tri avec Google Goyave est ComparisonChain
Collections.sort(pizzas, new Comparator<Pizza>() {
@Override
public int compare(Pizza p1, Pizza p2) {
return ComparisonChain.start().compare(p1.size, p2.size).compare(p1.nrOfToppings, p2.nrOfToppings).compare(p1.name, p2.name).result();
// or in case the fields can be null:
/*
return ComparisonChain.start()
.compare(p1.size, p2.size, Ordering.natural().nullsLast())
.compare(p1.nrOfToppings, p2.nrOfToppings, Ordering.natural().nullsLast())
.compare(p1.name, p2.name, Ordering.natural().nullsLast())
.result();
*/
}
});
C'est beaucoup mieux, mais nécessite une chaudière plaque de code pour la plupart des cas d'utilisation: null-valeurs de valeurs par défaut. Pour les nuls-champs, vous devez fournir une directive de Goyave que faire dans ce cas. C'est un mécanisme souple si vous voulez faire quelque chose de spécifique, mais souvent vous voulez le cas par défaut (ie. 1, a, b, z, null).
Tri avec Apache Commons CompareToBuilder
Collections.sort(pizzas, new Comparator<Pizza>() {
@Override
public int compare(Pizza p1, Pizza p2) {
return new CompareToBuilder().append(p1.size, p2.size).append(p1.nrOfToppings, p2.nrOfToppings).append(p1.name, p2.name).toComparison();
}
});
Comme la Goyave est ComparisonChain, cette bibliothèque de classe sortes facilement sur plusieurs champs, mais aussi définit le comportement par défaut pour les valeurs null (c'est à dire. 1, a, b, z, null). Cependant, vous ne pouvez pas spécifier autre chose, sauf si vous fournissez votre propre Comparateur.
Ainsi
En fin de compte, il revient à la saveur et le besoin de flexibilité (Goyave est ComparisonChain) vs code concis (Apache CompareToBuilder).