comparable comparator interfaces java
Цей підручник на прикладах пояснює концепцію порівняльного та порівняльного інтерфейсів у Java. Ви також дізнаєтесь про відмінності між ними:
Ми дізналися все про інтерфейси в наших попередніх уроках. Інтерфейс використовується для оголошення абстрактних методів та статичних або кінцевих змінних. За замовчуванням методи інтерфейсу є загальнодоступними. Починаючи з Java 8, в інтерфейсах також можуть бути визначені статичні та стандартні методи.
Java пропонує різні вбудовані інтерфейси, які ми можемо використовувати для виконання різних операцій. У цьому підручнику ми обговоримо два таких інтерфейси, тобто Comparable та Comparator. Подібний інтерфейс використовується для сортування об'єкта за природним упорядкуванням. Інтерфейс порівняння використовується для сортування окремих атрибутів різних об'єктів.
=> Ознайомтеся з простими навчальними серіями Java тут.
Почнемо з порівняльного інтерфейсу.
Що ви дізнаєтесь:
- Порівнянний інтерфейс в Java
- Інтерфейс порівняння в Java
- Різниця між порівнянними проти компаратора
- Висновок
Порівнянний інтерфейс в Java
Порівнянний інтерфейс сортує структури списку, такі як масиви та списки масивів, що містять власні об'єкти. Як тільки об’єкти списку реалізують порівнянний інтерфейс, ми можемо використовувати метод Collections.sort () або Arrays.sort () у випадку масивів для сортування вмісту.
Але коли у нас є власні класи і нам потрібно сортувати їх об’єкти, тоді нам доведеться реалізувати в цьому класі інтерфейс Comparable. Порівнянний інтерфейс є частиною java.lang пакет. Цей інтерфейс має лише один метод, CompareTo (). Використовуючи порівнянний інтерфейс, ми можемо сортувати окремий елемент даних за раз.
Наприклад, якщо в нашому класі в якості полів є ім’я та вік, тоді ми можемо сортувати об’єкти класу за іменем чи віком. Ми не можемо сортувати одночасно за іменем та віком.
Як пояснювалося вище, ми можемо реалізувати інтерфейс Comparable в Java, маючи власний клас для реалізації інтерфейсу Comparable. Інтерфейс Comparable має лише один метод ‘compareTo’, який потрібно замінити в класі, щоб сортувати власні об’єкти.
Метод ‘CompareTo’
Метод ‘compareTo’ інтерфейсу Comparable використовується для порівняння поточного об’єкта з даним об’єктом. Загальний синтаксис об'єкта compareTo наведено нижче.
public int compareTo (Object obj)
Як показано вище, метод compareTo приймає об'єкт як аргумент (це може бути будь-який спеціальний об'єкт) і порівнює його з поточним об'єктом, який використовується для виклику цього методу.
Метод compareTo повертає ціле число, яке може мати одне з таких значень:
- Позитивне (> 0) ціле число => поточний об'єкт> переданий параметр об'єкта.
- Негативний (поточний об'єкт
- Нуль (= 0) => поточний об'єкт і вказаний об'єкт рівні.
Ми можемо використовувати метод compareTo () для сортування:
- Об'єкти типу рядка
- Об'єкти класу обгортки
- Визначені користувачем або власні об'єкти
Тепер давайте реалізуємо приклад порівнянного інтерфейсу.
Приклад порівнянного інтерфейсу
Наступна програма Java реалізує клас Person, який містить ім'я та вік як поля-члени. Цей клас реалізує інтерфейс ‘Comparable’, який дозволить нам сортувати об’єкт класу Person.
Зверніть увагу, що, коли ми збираємося сортувати власні об’єкти, нам потрібно замінити метод ‘compareTo ()’ інтерфейсу Comparable.
Тестування баз даних запитання та відповіді для досвідчених
Усередині перевизначеного методу compareTo () ми порівнюємо вік переданого об'єкта людини з віком поточного об'єкта і відповідно повертаємо значення.
Нижче наведено приклад програми Java.
//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!'); } } }
Вихід:
Як видно з результату, ми використовуємо порівняльний інтерфейс для порівняння двох об'єктів класу Person на основі змінної члена віку.
Отже, як випливає з назви, порівнянний інтерфейс дозволяє нам порівнювати один об’єкт з іншим за умови, що об’єкти одного типу. Поки об’єкти знають, як влаштувати себе, ми можемо легко сортувати об’єкти, використовуючи єдиний метод ‘compareTo ()’, що належить цьому інтерфейсу.
Метод Java String CompareTo ()
Ми також можемо використовувати метод compareTo () для порівняння двох об’єктів типу String у Java. Два рядкові об’єкти порівнюються лексикографічно шляхом перетворення кожного символу рядкового об’єкта в його еквівалентний символ Unicode.
Якщо два рядки рівні, то повертається 0. Якщо перший об'єкт більший за другий, повертається позитивне значення і негативне значення, якщо перший об'єкт рядка менший за другий об'єкт String.
Наприклад,
string1.compareTo (string2) порівнятиме string1 та 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); } }
Вихід:
У наведеній вище програмі ми побачили, як використовувати метод compareTo () для порівняння двох рядків. До цього ми використовували метод compareTo () для порівняння цілочисельних значень (наприклад, віку). Подібним чином ми можемо використовувати інші типи даних, такі як подвійні, з методом compareTo ().
Тепер перейдемо до інтерфейсу Comparator у Java.
Інтерфейс порівняння в Java
Ми вже бачили роботу порівнянного інтерфейсу. Порівнянний інтерфейс дозволяє нам сортувати власні об'єкти на основі одного члена даних. Але коли виникає вимога сортувати об’єкт на основі кількох полів або членів даних, тоді ми можемо вибрати інтерфейс Comparator.
Використовуючи інтерфейс Comparator, ми можемо створити більше одного компаратора залежно від того, скільки полів ми хочемо використовувати для сортування користувацьких об’єктів. Використовуючи інтерфейс порівняння, припустимо, що ми хочемо сортувати спеціальний об’єкт за двома полями-членами ім’я та вік, тоді нам потрібно мати два порівняльника, один для імені та один для віку.
Тоді ми можемо викликати метод Collections.sort () за допомогою цих Компараторів.
То як саме ми можемо написати компаратори?
Розглянемо приклад учня класу, який має ім’я та вік. Враховуйте, що ми хочемо сортувати об’єкти студента за полями імені та віку.
Для цього нам спочатку доведеться написати класи Comparator, StudentAgeComparator та StudenNameComparator. У цих класах ми замінимо метод порівняння () інтерфейсу Comparator, а потім ми будемо викликати метод Collections.sort, використовуючи кожен із цих компараторів для сортування об’єктів студентів.
Інтерфейс порівняння містить об’єкт ‘порівняння’, який використовується для порівняння об’єктів двох різних класів. Загальний синтаксис методу порівняння:
public int порівняння (Object obj1, Object obj2);
Метод порівняння порівнює obj1 з obj2.
Інтерфейс компаратора є частиною java.util пакунку та крім методу порівняння; він також містить інший метод з назвою дорівнює.
Приклад порівняння Java
Давайте реалізуємо приклад Comparator у Java. Знову ми взяли клас студента з іменем та віком як його членами даних. Потім ми визначаємо клас порівняння AgeComparator, який замінює метод порівняння для порівняння віку двох учнів і повернення відповідних значень.
В основному методі ми створюємо Арраїл об’єктів Стьюдента. Потім ми викликаємо метод Collections.sort з аргументами ArrayList та AgeComparator. Це сортує об’єкти студента за віком.
Програма Java, що реалізує цей сценарій, наведена нижче.
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); } } }
Вихід:
У наведеній вище програмі, подібно до того, як ми написали AgeComparator для сортування об'єктів Student за віком, ми також можемо написати інший NameComparator для сортування об'єктів Student на основі поля імені.
Таким чином, ми можемо мати стільки класів порівняння, скільки потрібно для сортування об’єктів у різних полях. Спосіб порівняння двох змінних int ми також можемо порівняти змінні інших типів даних за допомогою методу Compare.
Різниця між порівнянними проти компаратора
Порівнянний інтерфейс | Інтерфейс порівняння |
---|---|
Використовує Collections.sort (List) для сортування елементів. | Використовує Collections.sort (List, Comparator) для сортування елементів. |
Порівнянний інтерфейс забезпечує сортування в одному полі. | Інтерфейс компаратора забезпечує сортування декількох полів. |
Порівнянний інтерфейс сортує об'єкт за природним впорядкуванням. | Інтерфейс порівняння сортує різні атрибути різних об'єктів. |
Використовуючи порівнянний інтерфейс, ми можемо порівняти поточний об’єкт ‘this’ із зазначеним об’єктом. | За допомогою інтерфейсу порівняння ми можемо порівнювати об’єкти різних класів. |
Частина пакету java.lang. | Частина пакету java.util. |
Використання порівнянного інтерфейсу змінює фактичний клас. | Компаратор не змінює початковий клас. |
Надає метод compareTo () для сортування елементів. | Надає метод compare () для сортування елементів. |
Часті запитання
Q # 1) Чи можна порівняти функціональний інтерфейс?
Відповідь: Так, порівнянним є функціональний інтерфейс. Він оголошує єдиний абстрактний метод, compareTo ().
Q # 2) Як зробити клас порівняльним?
Відповідь: Ми робимо клас порівнянним, реалізуючи інтерфейс Comparable. Усередині класу ми замінюємо метод compareTo (), щоб сортувати об'єкт. Ми передаємо об’єкт і порівнюємо його з поточним об’єктом.
Метод compareTo () повертає 0, якщо два об'єкти рівні. Він повертає від’ємне число, якщо перший об’єкт менше другого, і позитивний, якщо перший об’єкт більший за другий об’єкт.
Q # 3) Яка основна мета інтерфейсу компаратора?
Відповідь: Інтерфейс порівняння в основному використовується для сортування нестандартних об'єктів. Інтерфейс порівняння також можна використовувати для порівняння об’єктів різних класів. Також інтерфейс порівняння можна використовувати для сортування об'єктів у декількох полях.
Q # 4) Чому у Java використовується Comparator?
Відповідь: Інтерфейс порівняння в основному використовується, коли ми хочемо мати інший порядок сортування для наших користувацьких об'єктів, крім природного впорядкування на основі декількох полів.
Q # 5) Що реалізує порівнянний інтерфейс?
Відповідь: Порівняльний інтерфейс реалізований усіма класами обгортки та класом String. Спеціальні об'єкти також використовують подібний інтерфейс для сортування.
Висновок
У цьому підручнику ми обговорили порівнянні інтерфейси та інтерфейси порівняння в Java. Подібний інтерфейс використовується для сортування об’єктів за природним упорядкуванням і за один раз може сортувати об’єкти лише в одному полі.
Порівнянний інтерфейс має метод ‘compareTo ()’, який потрібно замінити в класі, що реалізує інтерфейс Comparator, і об’єкти якого слід сортувати.
Інтерфейс Comparator використовується для сортування користувацьких об'єктів, які слід сортувати за будь-яким іншим порядком. Інтерфейс порівняння також дозволяє сортувати об'єкти двох різних класів на основі декількох полів.
=> Прочитайте серію Easy Java Training.
Рекомендована література
- Інтерфейс Java та підручник з абстрактних класів із прикладами
- Встановити інтерфейс у Java: Підручник із набору Java з прикладами
- Розгортання Java: Створення та виконання файлу JAR Java
- Основи Java: Синтаксис Java, клас Java та основні концепції Java
- Віртуальна машина Java: як JVM допомагає у запуску програми Java
- Інтерфейс ListIterator в Java з прикладами
- Масив об'єктів у Java: Як створити, ініціалізувати та використовувати
- Підручник JAVA для початківців: 100+ практичних відео-підручників Java