Один из распространенных вопросов интервью: «В чем различия между Comparator и Comparable». или «Как вы будете сортировать коллекцию объектов сотрудников по их идентификатору или имени». Для этого мы можем использовать два интерфейса. Например, Comparator и Comparable. Прежде чем мы действительно увидим различия, позвольте мне кратко представить оба.
Сопоставимый интерфейс: класс, чьи объекты для сортировки должны реализовывать этот интерфейс. В этом случае мы должны реализовать метод compareTo (Object).
Например:
1
2
3
4
5
6
|
public class Country implements Comparable{ @Override public int compareTo(Object arg0) { Country country=(Country) arg0; return ( this .countryId < country.countryId ) ? - 1 : ( this .countryId > country.countryId ) ? 1 : 0 ; }} |
Если какой-либо класс реализует сопоставимый интерфейс, тогда коллекция этого объекта может быть автоматически отсортирована с помощью Collection.sort () или Arrays.sort (). Объект будет отсортирован на основе метода compareTo в этом классе.
Объекты, которые реализуют Comparable в Java, могут использоваться в качестве ключей в SortedMap, таком как TreeMap или SortedSet, как TreeSet, без реализации какого-либо другого интерфейса.
Интерфейс компаратора: класс, чьи объекты для сортировки не должны реализовывать этот интерфейс. Некоторые третьи классы могут реализовывать этот интерфейс для sort.egCountrySortByIdComparator, класс может реализовывать интерфейс Comparator для сортировки коллекции объекта страны по идентификатору. Например:
1
2
3
4
5
6
7
8
9
|
public class CountrySortByIdComparator implements Comparator<Country>{ @Override public int compare(Country country1, Country country2) { return (country1.getCountryId() < country2.getCountryId() ) ? - 1 : (country1.getCountryId() > country2.getCountryId() ) ? 1 : 0 ; } } |
Используя интерфейс Comparator, мы можем написать различную сортировку, основанную на различных атрибутах сортируемых объектов. Вы можете использовать анонимный компаратор для сравнения в определенной строке кода. Например:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
Country indiaCountry= new Country( 1 , 'India' ); Country chinaCountry= new Country( 4 , 'China' ); Country nepalCountry= new Country( 3 , 'Nepal' ); Country bhutanCountry= new Country( 2 , 'Bhutan' ); List<Country> listOfCountries = new ArrayList<Country>(); listOfCountries.add(indiaCountry); listOfCountries.add(chinaCountry); listOfCountries.add(nepalCountry); listOfCountries.add(bhutanCountry); //Sort by countryName Collections.sort(listOfCountries, new Comparator<Country>() { @Override public int compare(Country o1, Country o2) { return o1.getCountryName().compareTo(o2.getCountryName()); } }); |
Comparator vs Comparable
Java-код:
Для Comparable: Мы создадим класс страны, имеющий атрибут id и имя. Этот класс будет реализовывать интерфейс Comparable и реализовывать метод CompareTo для сортировки коллекции объекта страны по id.
1. Country.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package org.arpit.javapostsforlearning; //If this.cuntryId < country.countryId:then compare method will return -1 //If this.countryId > country.countryId:then compare method will return 1 //If this.countryId==country.countryId:then compare method will return 0 public class Country implements Comparable{ int countryId; String countryName; public Country( int countryId, String countryName) { super (); this .countryId = countryId; this .countryName = countryName; } @Override public int compareTo(Object arg0) { Country country=(Country) arg0; return ( this .countryId < country.countryId ) ? - 1 : ( this .countryId > country.countryId ) ? 1 : 0 ; } public int getCountryId() { return countryId; } public void setCountryId( int countryId) { this .countryId = countryId; } public String getCountryName() { return countryName; } public void setCountryName(String countryName) { this .countryName = countryName; } } |
2.ComparatorMain.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package org.arpit.javapostsforlearning; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ComparatorMain { /** * @author Arpit Mandliya */ public static void main(String[] args) { Country indiaCountry= new Country( 1 , 'India' ); Country chinaCountry= new Country( 4 , 'China' ); Country nepalCountry= new Country( 3 , 'Nepal' ); Country bhutanCountry= new Country( 2 , 'Bhutan' ); List<Country> listOfCountries = new ArrayList<Country>(); listOfCountries.add(indiaCountry); listOfCountries.add(chinaCountry); listOfCountries.add(nepalCountry); listOfCountries.add(bhutanCountry); System.out.println( 'Before Sort : ' ); for ( int i = 0 ; i < listOfCountries.size(); i++) { Country country=(Country) listOfCountries.get(i); System.out.println( 'Country Id: ' +country.getCountryId()+ '||' + 'Country name: ' +country.getCountryName()); } Collections.sort(listOfCountries); System.out.println( 'After Sort : ' ); for ( int i = 0 ; i < listOfCountries.size(); i++) { Country country=(Country) listOfCountries.get(i); System.out.println( 'Country Id: ' +country.getCountryId()+ '|| ' + 'Country name: ' +country.getCountryName()); } } } |
Выход:
01
02
03
04
05
06
07
08
09
10
|
Before Sort : Country Id: 1 ||Country name: India Country Id: 4 ||Country name: China Country Id: 3 ||Country name: Nepal Country Id: 2 ||Country name: Bhutan After Sort : Country Id: 1 || Country name: India Country Id: 2 || Country name: Bhutan Country Id: 3 || Country name: Nepal Country Id: 4 || Country name: China |
Для компаратора: мы создадим класс страны, имеющий атрибут id и имя, и создадим другой класс CountrySortByIdComparator, который будет реализовывать интерфейс компаратора и реализовывать метод сравнения для сортировки коллекции объекта страны по идентификатору, а также мы увидим, как использовать анонимный компаратор.
1.Country.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package org.arpit.javapostsforlearning; public class Country{ int countryId; String countryName; public Country( int countryId, String countryName) { super (); this .countryId = countryId; this .countryName = countryName; } public int getCountryId() { return countryId; } public void setCountryId( int countryId) { this .countryId = countryId; } public String getCountryName() { return countryName; } public void setCountryName(String countryName) { this .countryName = countryName; } } |
2.CountrySortbyIdComparator.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package org.arpit.javapostsforlearning; import java.util.Comparator; //If country1.getCountryId()<country2.getCountryId():then compare method will return -1 //If country1.getCountryId()>country2.getCountryId():then compare method will return 1 //If country1.getCountryId()==country2.getCountryId():then compare method will return 0 public class CountrySortByIdComparator implements Comparator<Country>{ @Override public int compare(Country country1, Country country2) { return (country1.getCountryId() < country2.getCountryId() ) ? - 1 : (country1.getCountryId() > country2.getCountryId() ) ? 1 : 0 ; } } |
3.ComparatorMain.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package org.arpit.javapostsforlearning; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class ComparatorMain { /** * @author Arpit Mandliya */ public static void main(String[] args) { Country indiaCountry= new Country( 1 , 'India' ); Country chinaCountry= new Country( 4 , 'China' ); Country nepalCountry= new Country( 3 , 'Nepal' ); Country bhutanCountry= new Country( 2 , 'Bhutan' ); List<Country> listOfCountries = new ArrayList<Country>(); listOfCountries.add(indiaCountry); listOfCountries.add(chinaCountry); listOfCountries.add(nepalCountry); listOfCountries.add(bhutanCountry); System.out.println( 'Before Sort by id : ' ); for ( int i = 0 ; i < listOfCountries.size(); i++) { Country country=(Country) listOfCountries.get(i); System.out.println( 'Country Id: ' +country.getCountryId()+ '||' + 'Country name: ' +country.getCountryName()); } Collections.sort(listOfCountries, new CountrySortByIdComparator()); System.out.println( 'After Sort by id: ' ); for ( int i = 0 ; i < listOfCountries.size(); i++) { Country country=(Country) listOfCountries.get(i); System.out.println( 'Country Id: ' +country.getCountryId()+ '|| ' + 'Country name: ' +country.getCountryName()); } //Sort by countryName Collections.sort(listOfCountries, new Comparator<Country>() { @Override public int compare(Country o1, Country o2) { return o1.getCountryName().compareTo(o2.getCountryName()); } }); System.out.println( 'After Sort by name: ' ); for ( int i = 0 ; i < listOfCountries.size(); i++) { Country country=(Country) listOfCountries.get(i); System.out.println( 'Country Id: ' +country.getCountryId()+ '|| ' + 'Country name: ' +country.getCountryName()); } } } |
Выход:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
Before Sort by id : Country Id: 1 ||Country name: India Country Id: 4 ||Country name: China Country Id: 3 ||Country name: Nepal Country Id: 2 ||Country name: Bhutan After Sort by id: Country Id: 1 || Country name: India Country Id: 2 || Country name: Bhutan Country Id: 3 || Country name: Nepal Country Id: 4 || Country name: China After Sort by name: Country Id: 2 || Country name: Bhutan Country Id: 4 || Country name: China Country Id: 1 || Country name: India Country Id: 3 || Country name: Nepal |
Ссылка: Отличие между Comparator и Comparable в Java от нашего партнера по JCG Арпита Мандлии в Java-фреймворках и шаблонах проектирования для начинающих .