comparable comparator interfaces java
Ce didacticiel explique le concept d'interfaces comparables et comparatives en Java avec des exemples. Vous découvrirez également les différences entre les deux:
Nous avons tout appris sur les interfaces dans nos précédents tutoriels. Une interface est utilisée pour déclarer des méthodes abstraites et des variables statiques ou finales. Par défaut, les méthodes d'interface sont publiques. Depuis Java 8, les interfaces peuvent également avoir des méthodes statiques et par défaut définies.
Java fournit diverses interfaces intégrées que nous pouvons utiliser pour effectuer diverses opérations. Dans ce tutoriel, nous discuterons de deux de ces interfaces, à savoir Comparable et Comparator. Une interface comparable est utilisée pour trier les objets selon l'ordre naturel. L'interface de comparaison est utilisée pour trier les attributs individuels de divers objets.
=> Découvrez la série de formations Java simples ici.
Commençons par une interface comparable.
Ce que vous apprendrez:
- Interface comparable en Java
- Interface de comparaison en Java
- Différence entre le comparateur comparatif et comparatif
- Conclusion
Interface comparable en Java
L'interface comparable trie les structures de liste telles que les tableaux et les listes de tableaux contenant des objets personnalisés. Une fois que les objets de liste implémentent l'interface Comparable, nous pouvons alors utiliser la méthode Collections.sort () ou Arrays.sort () dans le cas des tableaux pour trier le contenu.
Mais lorsque nous avons des classes personnalisées et que nous devons trier leurs objets, nous devrons implémenter l'interface Comparable dans cette classe. L'interface Comparable fait partie du java.lang paquet. Cette interface n'a qu'une seule méthode, CompareTo (). En utilisant une interface comparable, nous pouvons trier un seul membre de données à la fois.
Par exemple, si nous avons le nom et l'âge comme champs dans notre classe, nous pouvons à la fois trier les objets de la classe par nom ou par âge. Nous ne pouvons pas trier simultanément sur le nom et l'âge.
Comme expliqué ci-dessus, nous pouvons implémenter l'interface Comparable en Java en ayant une classe personnalisée pour implémenter l'interface Comparable. L'interface Comparable n'a qu'une seule méthode «compareTo» qui doit être remplacée dans la classe pour trier les objets personnalisés.
Méthode «CompareTo»
La méthode «compareTo» de l'interface Comparable est utilisée pour comparer l'objet actuel à l'objet donné. La syntaxe générale de l'objet compareTo est donnée ci-dessous.
public int compareTo (Object obj)
Comme indiqué ci-dessus, la méthode compareTo accepte un objet en tant qu'argument (il peut s'agir de n'importe quel objet personnalisé) et le compare à l'objet actuel utilisé pour appeler cette méthode.
La méthode compareTo renvoie une valeur entière qui peut avoir l'une des valeurs suivantes:
- Entier positif (> 0) => l'objet courant> le paramètre d'objet passé.
- Négatif (l'objet actuel
- Zéro (= 0) => l'objet courant et l'objet spécifié sont tous deux égaux.
Nous pouvons utiliser la méthode compareTo () pour trier:
- Objets de type chaîne
- Objets de classe Wrapper
- Objets définis par l'utilisateur ou personnalisés
Maintenant, implémentons un exemple d'interface comparable.
Exemple d'interface comparable
Le programme Java suivant implémente une classe Person qui contient le nom et l'âge en tant que champs membres. Cette classe implémente une interface «Comparable» qui nous permettra de trier l'objet de la classe Person.
Notez que lorsque nous allons trier les objets personnalisés, nous devons remplacer la méthode ‘compareTo ()’ de l’interface Comparable.
merge sort c ++ récursif
À l'intérieur de la méthode compareTo () remplacée, nous comparons l'âge de l'objet personne qui est passé avec celui de l'objet actuel et renvoyons en conséquence la valeur.
Un exemple de programme Java est donné ci-dessous.
//class person implementing Comparable interface class Person implements Comparable { private String name; private int age; //Person constructor public Person(String name, int age) { this.name = name; this.age = age; } //getter methods for Person members public int getAge() { return this.age; } public String getName() { return this.name; } //override toString () method @Override public String toString() { return ''; } //Override compareTo () method to compare age of two Person objects @Override public int compareTo(Person per) { if(this.age == per.age) return 0; else return this.age > per.age ? 1 : -1; } } public class Main{ public static void main(String() args) { //declare two objects of Person class Person p1 = new Person('Adrian', 24); Person p2 = new Person('Eddie', 26); int ageDiff = p1.compareTo(p2); //compare ages of two persons declared switch(ageDiff) { case -1: { System.out.println(p2.getName() + ' is older than ' + p1.getName()); break; } case 1: { System.out.println(p1.getName() + ' is older than ' + p2.getName()); break; } default: System.out.println(p1.getName () + ' and ' + p2.getName () + ' are of the same age!'); } } }
Production:
Comme le montre la sortie, nous utilisons une interface Comparable pour comparer deux objets de la classe Person en fonction de la variable membre age.
Ainsi, comme son nom l'indique, une interface Comparable nous permet de comparer un objet avec l'autre à condition que les objets soient du même type. Tant que les objets savent s’arranger, nous pouvons facilement trier les objets en utilisant la seule méthode ‘compareTo ()’ qui appartient à cette interface.
Méthode Java String CompareTo ()
Nous pouvons également utiliser la méthode compareTo () pour comparer deux objets de type String en Java. Les deux objets chaîne sont comparés lexicographiquement en convertissant chaque caractère de l'objet chaîne en son caractère Unicode équivalent.
Si deux chaînes sont égales, 0 est renvoyé. Si le premier objet est supérieur au second objet, une valeur positive est renvoyée et une valeur négative est renvoyée si le premier objet chaîne est inférieur au second objet String.
Par exemple,
string1.compareTo (string2) comparera lexicographiquement string1 et string 2.
public class Main { public static void main(String args()) { //declare and print string objects String str1 = 'SoftwareTestingHelp'; String str2 = 'Java Series tutorial'; String str3 = 'Comparable Interface'; System.out.println('str1:' + str1); System.out.println('str2:' + str2); System.out.println('str3:' + str3); //compare strings and print the results. int retval1 = str1.compareTo( str2 ); System.out.println('
str1 & str2 comparison: '+retval1); int retval2 = str1.compareTo( str3 ); System.out.println('str1 & str3 comparison: '+retval2); int retval3 = str2.compareTo('compareTo method'); System.out.println('str2 & string argument comparison: '+retval3); } }
Production:
Dans le programme ci-dessus, nous avons vu comment utiliser la méthode compareTo () pour comparer deux chaînes. Avant cela, nous avons utilisé la méthode compareTo () pour comparer les valeurs entières (age par exemple). De même, nous pouvons utiliser les autres types de données comme les doubles avec la méthode compareTo ().
Passons maintenant à l'interface Comparator en Java.
Interface de comparaison en Java
Nous avons déjà vu le fonctionnement de l'interface Comparable. L'interface comparable nous permet de trier les objets personnalisés en fonction d'un seul membre de données. Mais quand il est nécessaire de trier l'objet en fonction de plusieurs champs ou données membres, nous pouvons opter pour une interface de comparateur.
À l'aide de l'interface Comparator, nous pouvons créer plusieurs comparateurs en fonction du nombre de champs que nous voulons utiliser pour trier les objets personnalisés. En utilisant l'interface du comparateur, en supposant que nous voulions trier l'objet personnalisé sur deux champs de membre nom et âge, nous avons besoin de deux comparateurs, un pour le nom et un pour l'âge.
Ensuite, nous pouvons appeler la méthode Collections.sort () avec ces comparateurs.
Alors, comment pouvons-nous exactement écrire les comparateurs?
Prenons l'exemple d'un élève de classe avec le nom et l'âge comme champ. Considérez que nous voulons trier les objets Student sur les champs de nom et d'âge.
Pour cela, nous devrons d'abord écrire des classes Comparator, StudentAgeComparator et StudenNameComparator. Dans ces classes, nous remplacerons la méthode compare () de l'interface Comparator, puis nous appellerons la méthode Collections.sort en utilisant chacun de ces comparateurs pour trier les objets étudiants.
L’interface de comparaison contient un objet «comparer» utilisé pour comparer des objets de deux classes différentes. La syntaxe générale de la méthode de comparaison est:
public int compare (Object obj1, Object obj2);
La méthode compare compare obj1 avec obj2.
L'interface Comparator fait partie du java.util package et en dehors de la méthode de comparaison; il contient également une autre méthode nommée equals.
Exemple de comparateur Java
Implémentons un exemple de comparateur en Java. Encore une fois, nous avons pris une classe Student avec le nom et l'âge comme membres de données. Ensuite, nous définissons une classe de comparaison AgeComparator qui remplace la méthode de comparaison pour comparer les âges de deux élèves et renvoyer les valeurs appropriées.
Dans la méthode principale, nous construisons une Arraylist d'objets Student. Ensuite, nous appelons la méthode Collections.sort avec les objets ArrayList et AgeComparator comme arguments. Cela trie les objets Student en fonction de leur âge.
Le programme Java implémentant ce scénario est donné ci-dessous.
import java.util.*; //class student whose objects are to be sorted class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } //AgeComparator class implementing Comparator to compare objects class AgeComparator implements Comparator { public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } class Main{ public static void main(String args()){ //create an ArrayList of Students ArrayList myList=new ArrayList(); myList.add(new Student(101,'Adrian',25)); myList.add(new Student(106,'Sydney',22)); myList.add(new Student(105,'Marcus',27)); //call Collections.sort method with AgeComparator object to sort ArrayList Collections.sort(myList,new AgeComparator()); System.out.println('Sorted Student objects by Age are as follows:'); Iterator iter= myList.iterator(); while(iter.hasNext()){ Student st=(Student) iter.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } }
Production:
Dans le programme ci-dessus, semblable à la façon dont nous avons écrit AgeComparator pour trier les objets Student en fonction de l'âge, nous pouvons également écrire un autre NameComparator pour trier les objets Student en fonction du champ de nom.
De cette façon, nous pouvons avoir autant de classes Comparator que nécessaire pour trier les objets dans divers champs. La façon dont nous avons comparé deux variables int, nous pouvons également comparer les variables des autres types de données en utilisant la méthode Compare.
Différence entre le comparateur comparatif et comparatif
Interface comparable | Interface de comparaison |
---|---|
Utilise Collections.sort (List) pour trier les éléments. | Utilise Collections.sort (List, Comparator) pour trier les éléments. |
L'interface comparable fournit un tri de champ unique. | L'interface du comparateur permet de trier plusieurs champs. |
L'interface comparable trie l'objet selon l'ordre naturel. | L'interface du comparateur trie divers attributs de différents objets. |
En utilisant une interface comparable, nous pouvons comparer l’objet actuel «this» avec l’objet spécifié. | En utilisant une interface de comparaison, nous pouvons comparer des objets de différentes classes. |
Fait partie du package java.lang. | Fait partie du package java.util. |
L'utilisation d'une interface Comparable modifie la classe réelle. | Le comparateur ne modifie pas la classe d'origine. |
Fournit la méthode compareTo () pour trier les éléments. | Fournit la méthode compare () pour trier les éléments. |
Questions fréquemment posées
Q # 1) Une interface fonctionnelle est-elle comparable?
Répondre: Oui, comparable est une interface fonctionnelle. Il déclare une seule méthode abstraite, compareTo ().
Q # 2) Comment rendre une classe comparable?
Répondre: Nous rendons une classe comparable en implémentant l'interface Comparable. À l'intérieur de la classe, nous remplaçons la méthode compareTo () pour trier l'objet. Nous passons un objet et le comparons à l'objet courant.
La méthode compareTo () renvoie 0 si deux objets sont égaux. Il renvoie un nombre négatif si le premier objet est inférieur au second et positif si le premier objet est supérieur au second objet.
Q # 3) Quel est le but principal de l'interface du comparateur?
Répondre: L'interface du comparateur est principalement utilisée pour trier les objets personnalisés. Une interface de comparaison peut également être utilisée pour comparer des objets de différentes classes. De plus, l'interface du comparateur peut être utilisée pour trier des objets dans plusieurs champs.
Q # 4) Pourquoi Comparator est-il utilisé en Java?
Répondre: L'interface de comparaison est principalement utilisée lorsque nous voulons un ordre de tri différent pour nos objets personnalisés autre que l'ordre naturel basé sur plusieurs champs.
Q # 5) Qu'est-ce qui implémente l'interface Comparable?
Répondre: L'interface comparable est implémentée par toutes les classes wrapper et la classe String. Les objets personnalisés utilisent également l'interface comparable pour le tri.
Conclusion
Dans ce tutoriel, nous avons discuté des interfaces comparables et comparatives en Java. Une interface comparable est utilisée pour trier les objets selon l'ordre naturel et à la fois peut trier les objets uniquement sur un champ.
L’interface comparable a une méthode ‘compareTo ()’ qui doit être remplacée dans la classe implémentant l’interface Comparator et dont les objets doivent être triés.
L'interface Comparator est utilisée pour trier les objets personnalisés qui doivent être triés en fonction de tout autre ordre. L'interface du comparateur nous permet également de trier les objets de deux classes différentes en fonction de plusieurs champs.
=> Lisez la série de formations Easy Java.
lecture recommandée
- Tutoriel sur l'interface Java et la classe abstraite avec des exemples
- Définir l'interface en Java: didacticiel sur le jeu Java avec des exemples
- Déploiement Java: création et exécution d'un fichier JAR Java
- Principes de base de Java: syntaxe Java, classe Java et principaux concepts Java
- Machine virtuelle Java: comment JVM aide à exécuter une application Java
- Interface ListIterator en Java avec des exemples
- Tableau d'objets en Java: comment créer, initialiser et utiliser
- Tutoriel JAVA pour les débutants: plus de 100 tutoriels vidéo Java pratiques