Сопоставимо
Сопоставимый - это интерфейс сортировки.
Если класс реализует сопоставимый интерфейс, это означает, что «этот класс поддерживает сортировку». Поскольку классы, которые реализуют сортируемое сортировку поддержки интерфейса, предполагая, что в настоящее время существует «список списков (или массив) объектов классов, которые реализуют сопоставимый интерфейс», список списков (или массив) может быть отсортирован с помощью collections.sort (или arrays.sort).
Кроме того, «объект класса, который реализует сопоставимый интерфейс», может использоваться в качестве ключа в «упорядоченной карте (такой как treemap)» или элемент в «упорядоченном наборе (деревьях)» без указания компаратора.
Сопоставимый интерфейс включает только одну функцию, а его определение следующим образом:
Пакет java.lang; импортировать java.util.*; public interface complable <t> {public int compareto (t o);} Описание: Предположим, мы «сравниваем размеры x и y» через x.compareto (y). Если вы возвращаете «отрицательное число», это означает, что «X меньше Y»; Если вы вернете «ноль», это означает, что «X равен Y»; Если вы возвращаете «положительное число», это означает, что «X больше Y».
Сопоставимый интерфейс был общим, поэтому объект, который реализует сопоставимый, заявляет, с каким типом он можно сравнить. (Как правило, это тип самого объекта, но иногда он также может быть родительским классом.)
Общедоступный интерфейс сопоставимо {public boolean compareto (t other); }
Следовательно, сопоставимый интерфейс содержит параметр t типа T, который является типом объекта, который сопоставимый класс, который сопоставимый, может сравниваться. Это означает, что если вы определяете класс, который реализует сопоставимый, такой как строка, вы должны объявить не только сравнение класса, но и то, что он может сравнить (обычно с собой):
Строка открытого класса реализует сопоставимые {...}
Теперь давайте рассмотрим реализацию бинарного метода MAX (). Вы хотите принять два параметра одного типа, оба сопоставимы и сопоставимы друг с другом. К счастью, это довольно интуитивно, если вы используете общие методы и параметры ограниченного типа:
public static> t max (t t1, t t2) {if (t1.compareto (t2)> 0) return t1; иначе вернуть T2; }
В этом примере вы определяете общий метод, который генерируется на типе T, и вы ограничиваете сопоставимый разгибание типа (реализация). Оба параметра должны быть типа T, что означает, что они имеют одинаковый тип, сравнение поддержки и сопоставимы друг с другом. легкий!
Более того, компилятор будет использовать рассуждение типа, чтобы определить, что означает значение t, когда называется max (). Таким образом, нет необходимости указывать T вообще, будет работать следующий вызов:
String s = max ("moo", "bark");Компилятор рассчитает, что заранее определенное значение t является строкой, поэтому он будет выполнять компиляцию и проверку типов. Но если вы попытаетесь позвонить Max () с аргументами в класс X, которые не реализуют сопоставимый, компилятор не разрешит это.
Компаратор
Кораптор - это интерфейс компаратора.
Если нам нужно контролировать порядок определенного класса, который сам не поддерживает сортировку (то есть он не реализует сопоставимый интерфейс); Затем мы можем установить «компаратор этого класса» для сортировки. Этот «компаратор» должен только реализовать интерфейс компаратора.
То есть мы можем создать новый компаратор, «реализация класса компаратора», а затем сортировать класс через компаратор.
Интерфейс компаратора включает только две функции, а его определение следующим образом:
Package java.util; Public Interface Comparator <t> {int compare (t o1, t o2); Boolean Equals (Object obj);} иллюстрировать:
1. Если класс хочет реализовать интерфейс компаратора: он должен реализовать функцию Compareto (T O1, T O2), но он может не реализовать функцию Equals (Object obj).
Почему мы не можем реализовать функцию Equals (Object obj)? Потому что по умолчанию было реализовано equals (Object obj). Все классы в Java унаследованы от java.lang.object, а функция Equals (Object obj) реализована в Object.java; Поэтому все другие классы эквивалентны реализации этой функции.
2.int сравнивайте (T O1, T O2) - это «сравнить размеры O1 и O2». Возвращение «отрицательного числа» означает «O1 меньше O2»; возвращение «ноль», что означает «O1 равен O2»; Возвращение «положительного числа» означает «O1 больше O2».
Компаратор и сопоставимый
Сопоставимый - это интерфейс сортировки; Если класс реализует сопоставимый интерфейс, это означает, что «этот класс поддерживает сортировку».
Компаратор является компаратором; Если нам нужно контролировать порядок определенного класса, мы можем установить «компаратор этого класса» для его сортировки.
Нетрудно обнаружить, что сопоставимый эквивалентен «внутреннему компаратору», в то время как компаратор эквивалентен «внешнему компаратору».
Мы используем тестовую программу, чтобы проиллюстрировать эти два интерфейса. Исходный код заключается в следующем:
Импорт java.util.*; импортировать java.lang.comparable;/*** @desc Программа сравнения между «компаратором» и «сопоставимым». * (01) «Сопоставимо» * Это интерфейс сортировки, который содержит только одну функцию сравнения (). * Класс реализует сопоставимый интерфейс, который означает «сам класс поддерживает сортировку», который может быть отсортирован непосредственно через Arrays.sort () или Collections.sort (). * (02) «Кораптор» * Это интерфейс компаратора, включая две функции: compare () и equals (). * Класс реализует интерфейс компаратора, тогда это «компаратор». Другие классы могут быть отсортированы в соответствии с компаратором. * * Подводя итог: сопоставимый является внутренним компаратором, в то время как компаратор является внешним компаратором. * Сам класс реализует сопоставимый компаратор, что означает, что он поддерживает сортировку; Если он не реализует себя сопоставимо, он также может быть отсортирован через внешний компаратор компаратора. */public Class CompareComparatorAndCompableTest {public Static void main (String [] args) {// Создать новый ArrayList (Dynamic Array) ArrayList <Entry> list = new ArrayList <derss> (); // добавить объект в arraylist list.add (новый человек ("CCC", 20)); list.add (новый человек ("AAA", 30)); list.add (новый человек ("bbb", 10)); list.add (новый человек ("DDD", 40)); // распечатать исходную последовательность списков System.out.printf ("Оригинальный сортировка, список:%s/n", list); // Сортировать список // Здесь он будет отсортирован в соответствии с «сопоставимым интерфейсом <string>, реализованным человеком», то есть отсортирован в соответствии с «Имя», Collections.sort (List); System.out.printf ("Sorm Sort, список:%s/n", list); // Сортировка списка через «Compamator (AscageComparator)» // Метод сортировки AscageComparator: сортируется в соответствии с восходящим порядком «возраста» сборов. Список, новый AscageComparator ()); System.out.printf ("ASC (возраст) сортировка, список:%s/n", list); // Сортировка списка через «Кораптор (DescageComparator)». // метод сортировки DescageComparator: сортируйте в соответствии с порядок убывания «возраст» сборов. Список, новый Descagecomparator ()); System.out.printf ("desc (возраст) сортировка, список:%s/n", list); // Определите, являются ли два человека равными тестированием (); } /*** @desc проверяет, равны ли два человека. * Поскольку человек реализует функцию Equals (): если возраст и имя двух лиц равны, два человека считаются равными. * Итак, здесь P1 и P2 равны. * * Todo: если функция equals () лично удаляется, то P1 не равняется p2 */ private static void testequals () {Person P1 = новый человек ("eee", 100); Человек P2 = новый человек ("eee", 100); if (p1.equals (p2)) {System.out.printf (" %s равна %s/n", p1, p2); } else {System.out.printf (" %s не равна %s/n", p1, p2); }} /*** @desc Person Class. * Человек реализует сопоставимый интерфейс, что означает, что сам человек поддерживает сортировку*/ частное статическое классовое лицо реализует сопоставимый <person> {int age; String name; Public Person (string name, int age) {this.name = name; this.age = возраст; } public String getName () {return name; } public int getage () {return Age; } public String toString () {return name + " -" + age; } / *** Сравните, равны ли два человека: если их имя и возраст равны, они считаются равными* / boolean equals (человек) {if (this.age == person.age && this.name == person.name) вернуть true; вернуть ложь; } /*** @desc Реализуйте интерфейс «Сопоставимый <string>», то есть переписать функцию сравнения <t>. * Вот сравнение по «Имя человека»*/ @@override public int compareto (человек) {return name.compareto (person.name); // вернуть это. name - person.name; }} / *** @desc AscageComparator Comparator* Это «восходящий сравнительный возраст человека»* / Частный статический класс AscageComparator реализует компаратор <person> {@override public int compare (человек P1, человек p2) {return p1.getage () - p2.getage (); }} / *** @desc DescageComparator Comparator* Это «восходящий сравнительный возраст человека»* / Частный статический класс DescageComparator реализует компаратор <person> {@override public int compare (человек P1, человек P2) {return p2.getage () - p1.getage (); }}} Ниже приведено объяснение этой программы.
1. Определение класса лиц. следующее:
Частный статический класс лиц реализует сопоставимый <человек> {int возраст; String name; ... /*** @desc реализует интерфейс «Сопоставимый <string>», то есть переопределить функцию сравнения <T T>. * Вот сравнение по «Имя человека»*/ @@override public int compareto (человек) {return name.compareto (person.name); // вернуть это. name - person.name; }} иллюстрировать:
(1) Класс человека представляет человека. В классе Persong есть два атрибута: возраст (возраст) и имя «имя человека».
(2) Класс человека реализует сопоставимый интерфейс, поэтому его можно отсортировать.
2. В main () мы создаем список списков человека (список). следующее:
// Создать новый ArrayList (Dynamic Array) ArrayList <Entry> list = new ArrayList <Erance> (); // Добавить объект в arraylist list.add (новый человек («ccc», 20)); list.add (new Person ("aaa", 30)); List.add (новый человек ("bbb", 10); list.add (New Person ("Ddd", "dd", "dd"); 3. Далее мы распечатываем все элементы списка. следующее:
// Распечатать исходную последовательность списков System.out.printf ("Оригинальный сортировка, список:%s/n", list); 4. Затем мы сортируем список через функцию коллекций.
Поскольку человек реализует сопоставимый интерфейс, при сортировке через sort () он будет отсортирован в соответствии с методом сортировки, поддерживаемого человеком, то есть правилами, определенными сравнением (лицом). следующее:
// Сортировка списка // Здесь мы будем сортировать в соответствии с «сопоставимым интерфейсом <string>, реализованным человеком», то есть сортировка в соответствии с «Имя» Collections.sort (List); System.out.printf ("Sorm Sort, список:%s/n", list); 5. Сопоставимый и компаратор
Мы определяем двух компараторов, Ascagecomparator и Descagecomparator, чтобы подняться и человека нижнего порядка соответственно.
6. Comparator Comparator. Он сортирует человека в порядке возрастания по возрасту. Код заключается в следующем:
/*** @desc AscageComparator Comparator* Это «восходящий сравнительный корабель возраста человека»*/Частный статический класс AscageComparator реализует компаратор <person> {@override public int compare (человек P1, человек P2) {return p1.getage () - p2.getgeare (); }} 7. DescageComparator Comparator Он сортирует человека в порядке убывания по возрасту. Код заключается в следующем:
/*** @desc DescageComparator Comparator* Это «восходящий сравнитель возраста человека»*/Частный статический класс DescageComparator реализует компаратор <person> {@override public int compare (человек P1, человек P2) {return p2.getage () - p1.getage (); }} 8. Запустите программу в результате, вывод выглядит следующим образом:
Оригинальный сортировка, список: [CCC - 20, AAA - 30, BBB - 10, DDD - 40] Sort Sort, список: [AAA - 30, BBB - 10, CCC - 20, DDD - 40] ASC (возраст) Сорт, список: [BBB - 10, CCC - 20, AAA - 30, DDD - 40] DECS (AGE) SORT, SORT: DDD - AAA - AAA - AAA - AAA - AAA - AAA - AAA - AAA - AAA - AAA - AAA - 30, DDD - 40]. 20, BBB - 10] EEE - 100 равных EEE - 100