Java надає два інтерфейси для сортування об’єктів за допомогою членів даних класу:
supw
- Порівнянний
- компаратор
Використання порівняльного інтерфейсу
Порівняний об'єкт здатний порівнювати себе з іншим об'єктом. Сам клас повинен реалізовувати java.lang.Comparable інтерфейс для порівняння його екземплярів.
Розглянемо клас фільмів, який має такі учасники, як рейтинг, назва, рік. Припустімо, ми хочемо відсортувати список фільмів за роком випуску. Ми можемо реалізувати інтерфейс Comparable за допомогою класу Movie і замінити метод compareTo() інтерфейсу Comparable.
Java
// A Java program to demonstrate use of Comparable> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable> {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Driver class> class> Main> {> >public> static> void> main(String[] args)> >{> >ArrayList list =>new> ArrayList();> >list.add(>new> Movie(>'Force Awakens'>,>8.3>,>2015>));> >list.add(>new> Movie(>'Star Wars'>,>8.7>,>1977>));> >list.add(>new> Movie(>'Empire Strikes Back'>,>8.8>,>1980>));> >list.add(>new> Movie(>'Return of the Jedi'>,>8.4>,>1983>));> >Collections.sort(list);> >System.out.println(>'Movies after sorting : '>);> >for> (Movie movie: list)> >{> >System.out.println(movie.getName() +>' '> +> >movie.getRating() +>' '> +> >movie.getYear());> >}> >}> }> |
>
таблиця ascii в c
>Вихід
Movies after sorting : Star Wars 8.7 1977 Empire Strikes Back 8.8 1980 Return of the Jedi 8.4 1983 Force Awakens 8.3 2015>
Тепер припустімо, що ми хочемо відсортувати фільми також за їх рейтингом і назвами. Коли ми робимо елемент колекції порівнянним (через реалізацію Comparable), ми отримуємо лише один шанс реалізувати метод compareTo(). Розчин використовується компаратор.
Використання компаратора
На відміну від Comparable, Comparator є зовнішнім щодо типу елемента, який ми порівнюємо. Це окремий клас. Ми створюємо кілька окремих класів (які реалізують Comparator) для порівняння різними членами.
Клас Collections має другий метод sort() і використовує Comparator. Метод sort() викликає compare() для сортування об’єктів.
Щоб порівняти фільми за рейтингом, нам потрібно зробити 3 речі:
q3 місяці
- Створіть клас, який реалізує Comparator (і, таким чином, метод compare(), який виконує роботу, яку раніше виконував compareTo()).
- Створіть екземпляр класу Comparator.
- Викличте перевантажений метод sort(), надаючи йому як список, так і екземпляр класу, який реалізує Comparator.
Java
mysql змінити тип стовпця
// A Java program to demonstrate Comparator interface> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Class to compare Movies by ratings> class> RatingCompare>implements> Comparator {> >public> int> compare(Movie m1, Movie m2)> >{> >if> (m1.getRating() return -1; if (m1.getRating()>m2.getRating()) повертає 1; інакше повертає 0; } } // Клас для порівняння фільмів за назвою class NameCompare implements Comparator { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Клас драйвера class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(новий фільм('Пробудження сили', 8.3, 2015)); list.add(новий фільм('Зоряні війни', 8.7, 1977)); list.add( новий фільм ('Імперія завдає удару у відповідь', 8.8, 1980)); list.add( новий фільм ('Повернення джедая', 8.4, 1983)); // Сортувати за рейтингом: (1) Створити об’єкт // ratingCompare // (2) Викликати Collections.sort // (3) Друкувати відсортований список System.out.println('Відсортовано за рейтингом'); RatingCompare ratingCompare = новий RatingCompare(); Collections.sort(list, ratingCompare); for (Фільм фільм: список) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Виклик перевантаженого методу сортування за допомогою RatingCompare // (Ті самі три кроки, що й вище) System.out.println('
Sorted by name'); NameCompare nameCompare = новий NameCompare(); Collections.sort(list, nameCompare); for (Фільм фільм: список) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Використовує Comparable для сортування за роком System.out.println('
Відсортовано за роком'); Collections.sort(список); for (Фільм фільм: список) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
mysql update join
>
Вихід:
Sorted by rating 8.3 Force Awakens 2015 8.4 Return of the Jedi 1983 8.7 Star Wars 1977 8.8 Empire Strikes Back 1980 Sorted by name Empire Strikes Back 8.8 1980 Force Awakens 8.3 2015 Return of the Jedi 8.4 1983 Star Wars 8.7 1977 Sorted by year 1977 8.7 Star Wars 1980 8.8 Empire Strikes Back 1983 8.4 Return of the Jedi 2015 8.3 Force Awakens>
- Comparable призначений для об’єктів із природним упорядкуванням, що означає, що сам об’єкт повинен знати, як його слід упорядкувати. Наприклад, перелік студентів. Тоді як сортування інтерфейсу Comparator виконується через окремий клас.
- Логічно, інтерфейс Comparable порівнює це посилання з указаним об’єктом, а Comparator у Java порівнює два різні надані об’єкти класу.
- Якщо будь-який клас реалізує інтерфейс Comparable у Java, тоді колекцію цього об’єкта List або Array можна автоматично відсортувати за допомогою методу Collections.sort() або Arrays.sort(), а об’єкти будуть відсортовані на основі природного порядку, визначеного методом CompareTo.
- Основна відмінна риса полягає в тому, що використовуючи comparable, ми можемо використовувати лише одне порівняння. У той час як ми можемо написати більше одного власного компаратора для певного типу, використовуючи різні інтерпретації того, що означає сортування. Як і в порівняльному прикладі, ми могли просто відсортувати лише за одним атрибутом, тобто роком, але в компараторі ми також могли використовувати різні атрибути, як-от рейтинг, ім’я та рік.
Підводячи підсумок, якщо сортування об’єктів має базуватися на природному порядку, використовуйте Comparable, а якщо сортування потрібно виконувати за атрибутами різних об’єктів, використовуйте Comparator у Java.