comparable comparator interfaces java
Този урок обяснява концепцията за сравними и сравнителни интерфейси в Java с примери. Ще научите и за разликите между двете:
Научихме всичко за интерфейсите в нашите по-ранни уроци. Интерфейсът се използва за деклариране на абстрактни методи и статични или крайни променливи. По подразбиране методите на интерфейса са публични. Тъй като Java 8, интерфейсите също могат да имат статични и стандартни методи, дефинирани в тях.
Java предоставя различни вградени интерфейси, които можем да използваме за извършване на различни операции. В този урок ще обсъдим два такива интерфейса, т.е. сравним и сравнителен. Използва се сравним интерфейс за сортиране на обект според естественото подреждане. Интерфейсът за сравнение се използва за сортиране на отделни атрибути на различни обекти.
=> Тук ще разгледате простите серии за обучение по Java.
Нека започнем със сравним интерфейс.
Какво ще научите:
- Сравним интерфейс в Java
- Интерфейс за сравнение в Java
- Разлика между сравнимите Vs Comparator
- Заключение
Сравним интерфейс в Java
Сравним интерфейс сортира структурите на списъка като Arrays и ArrayLists, съдържащи персонализирани обекти. След като обектите от списъка изпълнят сравним интерфейс, тогава можем да използваме метода Collections.sort () или Arrays.sort () в случай на масивите за сортиране на съдържанието.
Но когато имаме персонализирани класове и трябва да сортираме техните обекти, тогава ще трябва да внедрим сравнимия интерфейс в този клас. Сравнимият интерфейс е част от java.lang пакет. Този интерфейс има само един метод, CompareTo (). Използвайки сравним интерфейс, можем да сортираме по един член на данни наведнъж.
Например, ако имаме име и възраст като полета в нашия клас, тогава в даден момент можем или да сортираме обектите на класа по име или възраст. Не можем да сортираме едновременно както по име, така и по възраст.
Както е обяснено по-горе, можем да приложим сравнимия интерфейс в Java, като имаме персонализиран клас за внедряване на сравнимия интерфейс. Сравнителният интерфейс има само един метод ‘compareTo’, който трябва да бъде заменен в класа, за да сортира потребителските обекти.
Метод ‘CompareTo’
Методът ‘compareTo’ на сравнимия интерфейс се използва за сравняване на текущия обект с дадения обект. Общият синтаксис на обекта compareTo е даден по-долу.
public int compareTo (обект obj)
Както е показано по-горе, методът compareTo приема обект като аргумент (това може да бъде всеки обект по избор) и го сравнява с текущия обект, използван за извикване на този метод.
Методът compareTo връща целочислена стойност, която може да има една от следните стойности:
- Положително (> 0) цяло число => текущият обект> подаденият параметър на обекта.
- Отрицателно (текущият обект
- Нула (= 0) => текущият обект и посоченият обект са равни.
Можем да използваме метода compareTo () за сортиране:
- Струнни обекти
- Обекти на клас Wrapper
- Потребителски или персонализирани обекти
Сега нека приложим пример за сравним интерфейс.
Пример за сравним интерфейс
Следващата програма Java изпълнява клас Person, който съдържа име и възраст като полета за член. Този клас реализира интерфейс ‘Comparable’, който ще ни позволи да сортираме обекта от клас Person.
Имайте предвид, че докато ще сортираме потребителски обекти, трябва да заменим метода ‘compareTo ()’ на сравнимия интерфейс.
основни въпроси за интервю за Java и отговори за по-нови
Вътре в метода overridden 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 ().
Сега да преминем към интерфейса за сравнение в Java.
Интерфейс за сравнение в Java
Вече видяхме работата на сравнимия интерфейс. Сравнимият интерфейс ни позволява да сортираме потребителски обекти въз основа на един член на данните. Но когато възникне изискването за сортиране на обекта въз основа на множество полета или членове на данни, тогава можем да изберем интерфейс за сравнение.
Използвайки интерфейса за сравнение, можем да създадем повече от един компаратор в зависимост от това колко полета искаме да използваме за сортиране на потребителските обекти. Използвайки сравнителния интерфейс, ако предположим, че искаме да сортираме персонализирания обект в две полета за членове име и възраст, тогава трябва да имаме два сравнителя, един за име и един за възраст.
След това можем да извикаме метода Collections.sort () с тези компаратори.
И така, как точно можем да напишем сравнителите?
Да разгледаме пример за ученик в клас с име и възраст като негово поле. Помислете, че искаме да сортираме обекти на ученици по полета за име и възраст.
За тази цел първо ще трябва да напишем класове за сравнение, StudentAgeComparator и StudenNameComparator. В тези класове ще заменим метода compare () на интерфейса Comparator и след това ще извикаме метода Collections.sort, използвайки всеки от тези компаратори за сортиране на обекти на ученици.
Интерфейсът за сравнение съдържа обект „сравнение“, който се използва за сравняване на обекти от два различни класа. Общият синтаксис на метода за сравнение е:
публичен int сравнение (Object obj1, Object obj2);
Методът за сравнение сравнява obj1 с obj2.
Интерфейсът за сравнение е част от java.util пакет и освен метода за сравнение; той съдържа и друг метод, наречен равно.
Пример за сравнение на Java
Нека да приложим пример за сравнение в Java. Отново взехме студентски клас с име и възраст като членове на данните. След това дефинираме клас за сравнение AgeComparator, който заменя метода за сравнение, за да сравнява възрастта на двама ученици и връща подходящи стойности.
В основния метод ние изграждаме Arraylist от обекти на Student. След това извикваме 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 въз основа на Age, можем да напишем и друг NameComparator, за да сортираме обектите на Student въз основа на полето за име.
По този начин можем да имаме толкова класове за сравнение, колкото е необходимо за сортиране на обекти в различни полета. Начинът, по който сравнихме две променливи int, можем също да сравним променливите от другите типове данни, използвайки метода Compare.
Разлика между сравнимите Vs Comparator
Сравним интерфейс | Интерфейс за сравнение |
---|---|
Използва Collections.sort (Списък) за сортиране на елементи. | Използва Collections.sort (List, Comparator) за сортиране на елементите. |
Сравнимият интерфейс осигурява сортиране на едно поле. | Интерфейсът за сравнение осигурява сортиране на множество полета. |
Сравним интерфейс сортира обекта според естественото подреждане. | Интерфейсът за сравнение сортира различни атрибути на различни обекти. |
Използвайки сравним интерфейс, можем да сравним текущия обект ‘this’ с посочения обект. | Използвайки сравнителен интерфейс, можем да сравняваме обекти от различни класове. |
Част от пакета java.lang. | Част от пакета java.util. |
Използването на сравним интерфейс променя действителния клас. | Компараторът не променя оригиналния клас. |
Предоставя метод compareTo () за сортиране на елементи. | Осигурява метод compare () за сортиране на елементи. |
често задавани въпроси
В # 1) Сравним ли е функционален интерфейс?
Отговор: Да, сравним е функционален интерфейс. Той декларира един абстрактен метод, compareTo ().
В # 2) Как да направите клас сравним?
Отговор: Ние правим клас сравним чрез прилагане на сравним интерфейс. Вътре в класа заместваме метода compareTo (), за да сортираме обекта. Предаваме обект и го сравняваме с текущия обект.
Методът compareTo () връща 0, ако два обекта са равни. Той връща отрицателно число, ако първият обект е по-малък от втория и положителен, ако първият обект е по-голям от втория обект.
В # 3) Каква е основната цел на интерфейса за сравнение?
Отговор: Интерфейсът за сравнение се използва главно за сортиране на потребителските обекти. Сравнителен интерфейс може да се използва и за сравняване на обекти от различни класове. Също така, сравнителният интерфейс може да се използва за сортиране на обекти в множество полета.
В # 4) Защо в Java се използва Comparator?
Отговор: Интерфейсът за сравнение се използва главно, когато искаме различен ред на сортиране за нашите потребителски обекти, различни от естественото подреждане въз основа на множество полета.
В # 5) Какво прилага сравнимия интерфейс?
Отговор: Сравним интерфейс е реализиран от всички класове обвивки и клас String. Персонализираните обекти също използват сравнимия интерфейс за сортиране.
Заключение
В този урок обсъдихме сравними и сравнителни интерфейси в Java. Сравним интерфейс се използва за сортиране на обектите според естественото подреждане и в даден момент може да сортира обектите само в едно поле.
Сравнимият интерфейс има метод ‘compareTo ()’, който трябва да бъде заменен в класа, изпълняващ интерфейса Comparator и чиито обекти трябва да бъдат сортирани.
Интерфейсът за сравнение се използва за сортиране на персонализирани обекти, които трябва да бъдат сортирани въз основа на друг ред. Сравнителният интерфейс също така ни позволява да сортираме обекти от два различни класа въз основа на множество полета.
=> Прочетете серията Easy Training Training.
Препоръчително четене
- Урок за интерфейс на Java и абстрактен клас с примери
- Задаване на интерфейс в Java: Урок за задаване на Java с примери
- Разполагане на Java: Създаване и изпълнение на Java JAR файл
- Основи на Java: Синтаксис на Java, клас Java и основни концепции на Java
- Java виртуална машина: Как JVM помага при стартирането на Java приложение
- ListIterator интерфейс в Java с примери
- Масив от обекти в Java: Как да създавате, инициализирате и използвате
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео