Je possède ArrayList d'objets personnalisés. J'ai besoin d'implémenter le tri par différents paramètres, c'est-à-dire l'année et le prix croissant et décroissant. Quelle est la meilleure façon de le faire? J'ai pensé à mettre en œuvre Comparator et passer le mode de tri au constructeur lors de l'instanciation du comparateur. Est-ce une bonne idée?Java comparant des objets personnalisés
Répondre
Je suggère d'utiliser une implémentation différente pour Comparator
par type de tri. Les classes internes anonymes, enums et, dans Java SE 8 (!), Lambdas, sont de bons moyens pour implémenter Comparator
et d'autres objets de type fonction sans état.
Vous pouvez inverser avec Collections.reverseOrder.
Oui. Une coutume Comparator
est un très bon moyen de le faire.
Comme mentionné par @Tom et @ Puce, vous pouvez reverse the order de votre Comparator
à la volée.
Oui, et pour l'ordre inverse, vous pouvez utiliser:
C'est une façon. Mais, cela n'a vraiment de sens que si c'est un moyen par défaut. Considérez la classe Customer suivante. Généralement, vous triez toujours les clients par leur nom. Mais parfois, vous voulez les trier par leur limite de crédit.
Il est logique d'implémenter Comparable pour plus de commodité. À tout le moins, vous pouvez rendre les comparateurs publics des composants finaux de la classe pour que les utilisateurs y aient facilement accès, et vous pouvez avoir confiance qu'ils ont été écrits par l'auteur de la classe (ou au moins quelqu'un connaissant bien la classe).
class Customer implements Comparable<Customer> {
public final Comparator<Customer> byCreditLimit = new Comparator<Customer>() {
public int compare(Customer c1, Customer c2) {
return c1.creditLimit.compareTo(c2.creditLimit);
}
public boolean equals(Object o) {
return o == this;
}
}
private String name;
private BigDecimal creditLimit;
public Customer(String name, BigDecimal creditLimit) {
this.name = name;
this.creditLimit = creditLimit;
}
public boolean equals(Object o) {
if(o instanceof Customer) {
Customer c = Customer(o);
return name.equals(c.name);
}
return false;
}
public int hashCode() {
return name.hashCode();
}
public int compareTo(Customer c) {
return name.compareTo(c.name);
}
}
Pourriez-vous dire pourquoi Comparable est meilleur que Comparator? –
Principalement pour la commodité. C'est une façon de dire: «La plupart du temps, vous devez trier les objets de ce type. C'est juste une chose de moins à penser. Imaginez que vous êtes un développeur utilisant une classe. Vous voulez que les objets soient triés pour des temps de recherche plus rapides. Le développeur sait que vous devriez obtenir une distribution relativement bonne en triant le nom, alors que le tri par limite de crédit serait moins efficace (beaucoup peuvent avoir le même crédit, mais l'égal indique qu'un ensemble aura au plus un avec un prénom). En utilisant Comparable, l'auteur peut fournir un mécanisme de comparaison par défaut. – corsiKa
Si une classe implémente Comparable, elle indique qu'elle a un "ordre naturel". De bons échantillons sont par exemple les classes de nombre (Integer, Long), qui sont triées par le nombre enveloppé. S'il n'y a pas de «commande naturelle» ou si vous voulez quelque chose de différent de la «commande naturelle» -> utilisez un comparateur – Puce
- 1. Java passant des objets personnalisés à Clojure
- 2. Aide Java comparant les objets du calendrier
- 3. QListe des objets personnalisés
- 4. égalité objets comparant
- 5. Python Tkinter comparant des objets PhotoImage
- 6. Où stocker des objets personnalisés?
- 7. arraylist avec des objets personnalisés
- 8. Magasin Arraylist des objets personnalisés
- 9. NSPredicates avec des objets personnalisés
- 10. NSMutableArray avec des objets personnalisés?
- 11. NSKeyedUnarchiver avec des objets personnalisés
- 12. Objets personnalisés/types Javascript
- 13. Comment créer des objets personnalisés/liste d'objets personnalisés dans VB.NET?
- 14. Composants personnalisés dans les objets d'authentification personnalisés
- 15. sorte NSArray avec des objets personnalisés
- 16. Étendre le style des objets personnalisés TreeView?
- 17. Comment retourner des objets personnalisés avec WebServices
- 18. Rechercher dans iOS pour des objets personnalisés
- 19. C# agrégation sur des objets personnalisés
- 20. Regroupement des objets personnalisés en Objective-C
- 21. Obj-c: Gestion des objets personnalisés
- 22. Passer des objets Python personnalisés à nosetests
- 23. JTable, JComboBox utilisant des objets personnalisés
- 24. NSArray avec des objets personnalisés dans NSTableDataSource
- 25. ExpandView ListView avec des objets personnalisés
- 26. comment classer hashset avec des objets personnalisés
- 27. Filtrage NSArray avec des objets personnalisés
- 28. Performance des données de base: NSPredicate comparant les objets
- 29. comparant les objets en utilisant JavaScript jquery
- 30. C# instanciation objets personnalisés
Un 'Comparator' personnalisé par type de tri, mais inversé avec' Collections.reverseOrder': http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#reverseOrder(java .util.Comparator) –