S'il faut utiliser Java Comparable ou Comparator

Le code de cet article est écrit en ** JDK 1.8 **.

introduction

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.

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.

Classe à comparer

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;

}

Définition par «comparable»

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 **.

Définition par «comparateur»

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());
    }

}

Postscript

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));

Alors, lequel utilisez-vous?

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.

Résumé

référence

[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

S'il faut utiliser Java Comparable ou Comparator
[Java] Comment utiliser Map
Comment utiliser java Facultatif
Comment utiliser la classe Java
[Java] Comment utiliser removeAll ()
Comment utiliser Java Map
[java] Raisons d'utiliser statique
Comment utiliser les variables Java
Comment utiliser HttpClient de Java (Get)
Comment utiliser HttpClient de Java (Post)
[Java] Comment utiliser la méthode de jointure
[Traitement × Java] Comment utiliser les variables
[JavaFX] [Java8] Comment utiliser GridPane
Comment utiliser les méthodes de classe [Java]
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?
[Traitement × Java] Comment utiliser les tableaux
Comment utiliser les expressions Java lambda
[Java] Comment utiliser la classe Math
Comment utiliser le type enum Java
[Java8] Utilisation appropriée de Compareable et Comparator du point de vue du tri des employés
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
[Java] Comment utiliser la classe File
Utilisez TMDA pour analyser IBM Java javacore
Bibliothèque de tests unitaires Java Artery-Easy to use
Comment utiliser la méthode de soumission (Java Silver)
[Explication facile à comprendre! ] Comment utiliser l'instance Java
[Java] Comment utiliser la méthode toString ()
Etudier comment utiliser le constructeur (java)
Comment déboguer à distance Java 9 ou version ultérieure
[Traitement × Java] Comment utiliser la boucle
Comment utiliser et définir les classes Java, importer
[Explication facile à comprendre! ] Comment utiliser le polymorphisme Java
[Java] [Maven3] Résumé de l'utilisation de Maven3
[Traitement × Java] Comment utiliser la classe
Comment utiliser la classe Java Scanner (Remarque)
[Traitement × Java] Comment utiliser la fonction
[Explication facile à comprendre! ] Comment utiliser ArrayList [Java]
[Java] Comment utiliser la classe Calendar
[Java] Découvrez comment utiliser correctement Optional
[Explication facile à comprendre! ] Comment utiliser la surcharge Java
gestion des exceptions try-catch-finally Comment utiliser java
[Explication facile à comprendre! ] Comment utiliser l'encapsulation Java
Utilisez jenv pour activer plusieurs versions de Java
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Comment utiliser le framework Java avec AWS Lambda! ??
Je veux utiliser java8 forEach avec index
Comment utiliser l'API Java avec des expressions lambda
Utilisez Matplotlib depuis Java ou Scala avec Matplotlib4j
[Explication facile à comprendre! ] Comment utiliser l'héritage Java [Explication de remplacement]
[Java] Introduction à Java
Comment utiliser la méthode replace () (Java Silver)
[Java] Utilisez Collectors.collectingAndThen