Предисловие
Когда это относится к сравнению операции сравнения «размера» двух объектов при выполнении алгоритмов, таких как вставка, сортировка холма и сортировка слияния. Легко понять метод сравнения INTEGER I> J, но когда мы сортируем несколько объектов, как мы сравниваем «размер» двух объектов? Такие сравнения stu1> stu2, очевидно, невозможно скомпилировать. Чтобы решить проблему того, как сравнить размер двух объектов, JDK предоставляет два интерфейса java.lang.Comparable и java.util.Comparator .
1. Естественная сортировка: java.lang.comparable
В сопоставимом интерфейсе есть только один метод: compareTo(Object obj) , и возвратное значение этого метода - int. Если возвратное значение является положительным числом, это означает, что текущий объект (объект, который вызывает метод), «больше», чем объект OBJ; В противном случае это "маленький"; Если он нулевой, это означает, что два объекта равны.
Вот ученик, который реализует сопоставимый интерфейс:
студент публичного класса реализует сопоставимые {private Int ID; Приватное название строки; public Student () {super (); } @Override public int compareto (Object obj) {if (obj exanceOf Студент) {Студент stu = (студент) obj; Возврат идентификатор - stu.id; } return 0; } @Override public String toString () {return "<" + id + "," + name + ">"; }} Студент реализует естественную интерфейс сортировки сопоставимо. Итак, как мы используем этот интерфейс для сортировки набора студенческих объектов? Когда мы изучали массивы, мы использовали класс для сортировки целочисленных массивов: java.util.Arrays . Мы используем метод сортировки массивов для сортировки целочисленных массивов. После переворачивания документации API вы обнаружите, что массивы дают много перегруженных форм метода вида, включая sort(Object[] obj) , что означает, что Arryas также могут сортировать массивы объектов. При сравнении «размер» двух объектов в процессе сортировки сопоставимый интерфейс используется для сравнения метода сравнения.
Открытый класс сравнение {public static void main (string [] args) {Студент Stu1 = новый студент (1, "Little"); Студент STU2 = новый студент (2, "Cyntin"); Студент stu3 = новый студент (3, "Тони"); Студент STU4 = новый студент (4, "Близнецы"); Студент [] stus = новый студент [4]; stu0] = stu1; stu1 [1] = stu4; stus [2] = stu3; stu3] = stu2; System.out.println ("Array:" + Arrays.tostring (stus)); Arrays.sort (Stus); System.out.println ("sort:" + arrays.tostring (stus)); }} Порядок, в котором элементы добавляются в студенческий массив, не добавляется в соответствии с идентификатором студента. После вызова Arrays.sort(stus) сортируйте студенческий массив. Независимо от того, какой алгоритм сортировки используется для его реализации, определенно необходимо сравнить работу «размер» двух объектов. Так как же сравнить «размер» двух объектов? Сопоставимый интерфейс, реализованный студентом, вступает в игру. Метод сортировки отбросит объект, который будет сравниваться с сопоставимым, и вызовет метод сравнения, чтобы оценить «размер» этих двух объектов на основе его возвращаемого значения. Следовательно, в этом примере первоначальный студенческий массив вне порядка, отсортированный, становится студенческим массивом, отсортированным по номеру студентов.
Но мы заметили, что алгоритм сортировки связан с учеником, а у студента есть только один алгоритм сортировки. Но это не так в реальном обществе. Что если мы не хотим сортировать по номеру студентов? Что если мы хотим сортировать студентов по имени? Мы можем изменить только метод сравнения сопоставимого интерфейса класса ученика и изменить его на сортировку по имени. Что, если в одной системе есть две операции, одна сортируется по номеру студента, а другая отсортирована по имени? Невозможно написать две реализации сравнения методов в органе класса учеников. С этой точки зрения, сопоставимый имеет ограничения. Чтобы восполнить этот недостаток, JDK также предоставляет нам другой метод сортировки, который является сортировкой компаратора, о которой мы будем говорить ниже.
2. Compagerator Sorting: java.util.comparator
Я упомянул выше, что причина, по которой представлен интерфейс сортировки компаратора, заключается в том, что иногда необходимо сортировать один и тот же объект по -разному, и эта естественная сопоставимая сортировка не может быть реализована. Кроме того, одним из преимуществ интерфейса компаратора является то, что он отделяет алгоритм сортировки сравнения от специфического класса сущности.
Если вы просмотрите API, вы обнаружите, что есть также перегруженная форма Arrays.sort: sort(T[] a, Comparator<? super T> c) . Метод использует дженерики для написания параметров этого метода, о которых мы еще не упомянули. Мы можем понять это как эта форма: sort(Object[] a, Comparator c) , что означает сортировку массива объектов в соответствии с алгоритмом сортировки сравнения, данным Comparator c. Есть два метода, определенные в интерфейсе компаратора: compare(Object o1, Object o2) и equals методами. Поскольку метод equals имеет методы для всех объектов, когда мы реализуем интерфейс компаратора, нам нужно только переопределить метод compare , а не переопределить метод equals . Описание метода переоценки равных в интерфейсе компаратора: «Обратите внимание, что всегда безопасно не перезаписать метод Object.equals(Object) . Однако в некоторых случаях перезаписывание этого метода может позволить программе определить, принуждает ли два разных компаратора одинаковую сортировку, тем самым повышая производительность». Нам нужно только знать первое предложение, и все в порядке. То есть нам не нужно думать о том, как реализовать метод Equals, потому что даже если мы не показываем реализацию метода Equals, но используем метод Equals в классе объекта, код все еще безопасен.
Итак, давайте напишем код, чтобы сортировать его с компаратором. Это все еще делается с учеником, но сопоставимый интерфейс не реализован. Поскольку класс реализации компаратора использует только дисплей для реализации одного метода, нам не нужно писать класс для его реализации. Когда нам нужно использовать компаратор, мы можем написать анонимный внутренний класс для реализации компаратора.
Вот наш метод сортировки по имени:
public void sortbyName () {Студент Stu1 = новый студент (1, "Little"); Студент STU2 = новый студент (2, "Cyntin"); Студент stu3 = новый студент (3, "Тони"); Студент STU4 = новый студент (4, "Близнецы"); Студент [] stus = новый студент [4]; stu0] = stu1; Stu1; Stu4; stu2] = stu3; stu3] = stu2; System.out.println ("Array:" + Arrays.tostring (stus)); Arrays.sort (stus, new Comparator () {@override public int compare (объект O1, объект O2) {if (o1 exantef of of Student && o2 exaction of Student) {Студент S1 = (студент) O1; Студент S2 = (Студент) O2; // return s1.getId () - s2.getId (); s1.getName (). CompareTo (s2.getName ()); System.out.println ("Sorted:" + Arrays.tostring (stus)); }Когда нам нужно сортировать студента по номеру студента, нам просто нужно изменить код во внутреннем классе, который реализует компаратор в нашем методе сортировки, без изменения класса студентов.
Примечание. Конечно, вы также можете использовать класс студентов для реализации интерфейса компаратора, чтобы студент был (а) компаратор (компаратор). Когда вам нужно использовать этот вид, просто используйте студента в качестве компаратора. Вы можете передать студента в качестве параметра в метод сортировки, потому что студент является компаратором. Но такой код не является отличным кодом, потому что одна из важных причин, по которой мы используем компаратор, заключается в том, что он может отделить алгоритм сравнения от конкретных классов и уменьшить связь между классами.
Treesset обеспечивает поддержку обоих методов сравнения, соответствующих двум методам конструктора Treesset:
1. Treeset (): сравнение и сортировка в соответствии с методом сравнения сопоставимого интерфейса, реализованного элементами в Treeset
2. Treesset (компаратор компаратора): сравнение и сортировки в Treesset в соответствии с данным компаратором компаратора
При добавлении элемента к деревьям, деревья сортирует элементы. Что касается того, следует ли сортировать с естественным порядком или компаратором, это зависит от того, как написана ваша конструкция деревьев. Конечно, при добавлении первого элемента не будет сравнения. В деревьях нет элементов. С кем я могу сравнить?
Ниже приведен тестовый код деревьев с использованием двух методов сортировки и сравнения:
/ *** Использовать естественную сортировку* Студент должен реализовать сопоставимый интерфейс, в противном случае ClassCastException будет брошено*/ public void testSortedSet3 () {Студент Stu1 = новый студент (1, «Little»); Студент STU2 = новый студент (2, "Cyntin"); Студент stu3 = новый студент (3, "Тони"); Студент STU4 = новый студент (4, "Близнецы"); SortedSet set = new Treeset (); set.add (stu1); set.add (stu3); // Если студент не реализует сопоставимый интерфейс, добавьте classcastException set.add (stu4); set.add (stu2); set.add (stu4); set.add (новый студент (12, "Little")); System.out.println (set); } / *** Использовать компаратор для сортировки* Студент может быть просто простым классом Java без реализации сопоставимого интерфейса*/ public void testSortedSet3 () {Студент Stu1 = новый студент (1, "Little"); Студент STU2 = новый студент (2, "Cyntin"); Студент stu3 = новый студент (3, "Тони"); Студент STU4 = новый студент (4, "Близнецы"); SortedSet set = new TreaSet (new Comparator () {@Override public int compare (Object O1, Object O2) {if (o1 exactionOf Студент && o2 exaction Of Student) {Студент S1 = (Студент) O1; Студент S2 = (студент) O2; return s1.getName (). Comparto (s2.getName ());} return 0.getName (). set.add (stu1); set.add (stu3); set.add (stu4); set.add (stu2); set.add (stu4); set.add (новый студент (12, "Little")); System.out.println (set); } Кроме того, введите класс инструментов, java.util.Collections . Обратите внимание, что это не интерфейс сбора. Коллекции очень похожи на класс массивов. Массивы предоставляют серию статических методов для массива, найдите сортировку и многое другое. Коллекции также предоставляют серию таких методов, но используется для обработки коллекций. Хотя класс коллекций очень похож на интерфейс Collections, не пугайтесь названием коллекций. Это не класс реализации, который может обрабатывать только интерфейс сбора и подметки, но также может обрабатывать класс реализации интерфейса карты.
Суммировать
Это конец введения в естественную сортировку и сортировку компаратора в Java. Статья все еще относительно подробно. Я надеюсь, что это может помочь вам в учебе или на работе. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.