Le code de cet article est écrit en ** JDK 1.8 **.
Lorsque vous comparez des objets de votre propre classe, vous devez définir une logique de comparaison de ce qui les rend grands et petits. Il existe les deux méthodes de définition suivantes.
Comparable
et définissez-la avec la méthode compareTo
.
--Définissez une classe qui implémente l'interface Comparator
et définissez-la avec la méthode compare
.Il peut être défini par l'une ou l'autre méthode, mais il existe une ligne directrice pour laquelle définir, donc je vais l'expliquer.
Pensez à comparer la classe «Livre» avec les informations contenues dans le livre.
public class Book {
//Titre
private String title;
//prix
private int price;
//date d'Emission
private LocalDate dateOfIssue;
}
Implémentez l'interface Comparable
de java.lang
et remplacez la méthode compareTo
pour définir la logique de comparaison.
Par exemple, si vous voulez comparer avec title
, implémentez comme suit.
public class Book implements Comparable<Book>{
//Titre
private String title;
//prix
private int price;
//date d'Emission
private LocalDate dateOfIssue;
@Override
public int compareTo(Book book){
return title.compareTo(book.title);
}
}
Le résultat de la comparaison de «title» est renvoyé tel quel. Le tri de la liste des objets «Livre» les trie par ordre croissant de «titre».
** Exemple de tri **
Book book1 = new Book();
book1.setTitle("Doraemon");
book1.setPrice(500);
book1.setDateOfIssue(LocalDate.of(2010,10,10));
Book book2 = new Book();
book2.setTitle("Perman");
book2.setPrice(400);
book2.setDateOfIssue(LocalDate.of(2012,10,10));
Book book3 = new Book();
book3.setTitle("Oba Q");
book3.setPrice(300);
book3.setDateOfIssue(LocalDate.of(2014,10,10));
List<Book> bookList = Arrays.asList(book1, book2, book3);
System.out.println("Avant de trier:" + bookList);
Collections.sort(bookList);
System.out.println("Après le tri:" + bookList);
sort (List <T> list)
of java.util.Collections
compare les éléments entre eux selon le compareTo
de l'objet de l'élément et les trie.
** Résultat d'exécution **
Avant de trier:[Book(title=Doraemon, price=500, dateOfIssue=2010-10-10), Book(title=Perman, price=400, dateOfIssue=2012-10-10), Book(title=Oba Q, price=300, dateOfIssue=2014-10-10)]
Après le tri:[Book(title=Oba Q, price=300, dateOfIssue=2014-10-10), Book(title=Doraemon, price=500, dateOfIssue=2010-10-10), Book(title=Perman, price=400, dateOfIssue=2012-10-10)]
Notez que compareTo
ne peut définir que ** une logique de comparaison **.
Créez une classe qui implémente le Comparator
de java.util
et remplacez la méthode compare
pour définir la logique de comparaison. Par exemple, si vous voulez comparer avec title
, implémentez comme suit.
public class BookTitleComparator implements Comparator<Book> {
@Override
public int compare(Book book1, Book book2){
return book1.getTitle().compareTo(book2.getTitle());
}
}
Utilisons ceci pour trier.
** Exemple de tri **
Book book1 = new Book();
book1.setTitle("Doraemon");
book1.setPrice(500);
book1.setDateOfIssue(LocalDate.of(2010,10,10));
Book book2 = new Book();
book2.setTitle("Perman");
book2.setPrice(400);
book2.setDateOfIssue(LocalDate.of(2012,10,10));
Book book3 = new Book();
book3.setTitle("Oba Q");
book3.setPrice(300);
book3.setDateOfIssue(LocalDate.of(2014,10,10));
List<Book> bookList = Arrays.asList(book1, book2, book3);
System.out.println("Avant de trier:" + bookList);
bookList.sort(new BookTitleComparator());
System.out.println("Après le tri:" + bookList);
** Résultat d'exécution **
Avant de trier:[Book(title=Doraemon, price=500, dateOfIssue=2010-10-10), Book(title=Perman, price=400, dateOfIssue=2012-10-10), Book(title=Oba Q, price=300, dateOfIssue=2014-10-10)]
Après le tri:[Book(title=Oba Q, price=300, dateOfIssue=2014-10-10), Book(title=Doraemon, price=500, dateOfIssue=2010-10-10), Book(title=Perman, price=400, dateOfIssue=2012-10-10)]
Vous pouvez créer n'importe quel nombre de classes qui implémentent Comparator
selon la logique de comparaison ** comme indiqué ci-dessous.
** Comparaison de prix Comparateur
**
public class BookPriceComparator implements Comparator<Book> {
@Override
public int compare(Book book1, Book book2){
return Integer.valueOf(book1.getPrice()).compareTo(book2.getPrice());
}
}
** Comparaison de la date d'émission Comparator
**
public class BookDateOfIssueComparator implements Comparator<Book> {
@Override
public int compare(Book book1, Book book2){
return book1.getDateOfIssue().compareTo(book2.getDateOfIssue());
}
}
Si vous utilisez la méthode statique «compare» de «Comparator», vous n'avez même pas besoin de créer une classe.
//Ordre des titres
bookList.sort(Comparator.comparing(Book::getTitle));
//Par prix
bookList.sort(Comparator.comparing(Book::getPrice));
//Par date d'émission
bookList.sort(Comparator.comparing(Book::getDateOfIssue));
D'après la conclusion, je pense qu'il est ** fondamentalement préférable d'utiliser «Comparator» **.
Puisque «Comparable» ne peut définir qu'un «compareTo» qui appartient à une classe, il est dit que vous devez implémenter la logique de comparaison qui semble la plus naturelle pour cette classe. Par exemple, «LocalDate» semble être une comparaison naturelle entre les dates, donc «compareTo» est implémenté dans la logique «date précédente <après date».
Alors dans quel domaine est-il naturel de comparer dans ce "Livre"? Est-ce un titre en quelque sorte? Il semble que, selon la personne, la comparaison par date de publication puisse être naturelle, et si un champ tel que bookId
est ajouté à l'avenir, ce sera encore plus flou, non? Je n'ai qu'un sentiment d'insecte.
Comparator
peut ** spécifier clairement ce qu'est la comparaison avec le nom de la classe **, vous pouvez donc éviter un tel flou. De plus, si vous souhaitez effectuer une comparaison complexe telle que la comparaison par date de publication si les titres sont identiques, vous pouvez ajouter une classe d'implémentation Comparator
distincte.
Comparator
peut spécifier le contenu de la logique de comparaison par le nom de la classe à implémenter.
--Dans Comparable
, une seule logique de comparaison peut être implémentée, mais dans Comparator
, autant que le nombre de classes peut être implémenté.Comparator
![Introduction à Java - Des bases du style moderne aux bibliothèques orientées objet et pratiques](https://www.amazon.co.jp/Java%E6%9C%AC%E6%A0%BC%E5%85%A5%] E9% 96% 80-% EF% BD% 9E% E3% 83% A2% E3% 83% 80% E3% 83% B3% E3% 82% B9% E3% 82% BF% E3% 82% A4% E3 % 83% AB% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E5% 9F% BA% E7% A4% 8E% E3% 81% 8B% E3% 82% 89% E3% 82 % AA% E3% 83% 96% E3% 82% B8% E3% 82% A7% E3% 82% AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 83% BB % E5% AE% 9F% E7% 94% A8% E3% 83% A9% E3% 82% A4% E3% 83% 96% E3% 83% A9% E3% 83% AA% E3% 81% BE% E3 % 81% A7-% E8% B0% B7% E6% 9C% AC-% E5% BF% 83-ebook / dp / B071D8RYR5) Comparable (Java Platform SE 8 ) Comparator (Java Platform SE 8 )
Recommended Posts