Один из распространенных вопросов интервью: «В чем различия между 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 0public 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: IndiaCountry Id: 4||Country name: ChinaCountry Id: 3||Country name: NepalCountry Id: 2||Country name: BhutanAfter Sort : Country Id: 1|| Country name: IndiaCountry Id: 2|| Country name: BhutanCountry Id: 3|| Country name: NepalCountry 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: IndiaCountry Id: 4||Country name: ChinaCountry Id: 3||Country name: NepalCountry Id: 2||Country name: BhutanAfter Sort by id: Country Id: 1|| Country name: IndiaCountry Id: 2|| Country name: BhutanCountry Id: 3|| Country name: NepalCountry Id: 4|| Country name: ChinaAfter Sort by name: Country Id: 2|| Country name: BhutanCountry Id: 4|| Country name: ChinaCountry Id: 1|| Country name: IndiaCountry Id: 3|| Country name: Nepal |
Ссылка: Отличие между Comparator и Comparable в Java от нашего партнера по JCG Арпита Мандлии в Java-фреймворках и шаблонах проектирования для начинающих .