Статьи

Разница между Comparator и Comparable в Java

Один из распространенных вопросов интервью: «В чем различия между 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

параметр сравнимый компаратор
Логика сортировки Логика сортировки должна быть в том же классе, чьи объекты сортируются. Следовательно это называется естественным упорядочением объектов Логика сортировки находится в отдельном классе. Следовательно, мы можем написать различную сортировку на основе разных атрибутов объектов, которые будут отсортированы. Например, сортировка по идентификатору, имени и т. Д.
Реализация Класс, чьи объекты должны быть отсортированы, должен реализовывать этот интерфейс .eg Класс страны должен реализовываться сопоставимым с коллекцией объекта страны по идентификатору Класс, чьи объекты должны быть отсортированы, не должен реализовывать этот интерфейс. Некоторые другие классы могут реализовывать этот интерфейс. Класс Eg-CountrySortByIdComparator может реализовывать интерфейс Comparator для сортировки коллекции объектов страны по идентификатору

Метод сортировки
int compareTo (Объект o1)
Этот метод сравнивает этот объект с объектом o1 и возвращает целое число. Его значение имеет следующее значение
1. положительный — этот объект больше, чем o1
2. ноль — этот объект равен o1
3. отрицательный — этот объект меньше, чем o1
int Сравнить (Объект o1, Объект o2)
Этот метод сравнивает объекты o1 и o2. и возвращает целое число. Его значение имеет следующее значение.
1. положительный — o1 больше, чем o2
2. ноль — o1 равен o2
3. отрицательный — o1 меньше, чем o1
Вызов метода Collections.sort (Список)
Здесь объекты будут отсортированы на основе метода CompareTo
Collections.sort (список, компаратор)
Здесь объекты будут отсортированы на основе метода Compare в Comparator
пакет java.lang.Comparable

Java.util.Comparator

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-фреймворках и шаблонах проектирования для начинающих .