Подробное объяснение и разница между Java сопоставимым и компаратором
Java предоставляет нам два механизма сравнения: сопоставимый и компаратор. В чем разница между ними? Давайте узнаем сегодня.
Сравнимый естественный вид
Сопоставимый - интерфейс в пакете java.lang, и есть только один метод, который Compareto () внутри:
Общедоступный интерфейс сопоставимо <t> {public int compareto (t o);}Сопоставимо позволяет сравнивать объекты класса, которые его реализуют. Конкретные правила сравнения выполняются в соответствии с правилами в методе сравнения. Этот порядок называется естественным порядком.
Есть три случая, когда возвращаемое значение метода сравнения:
Уведомление:
1. Поскольку NULL не является классом или объектом, вы должны обратить внимание на случай E.comPareto (NULL) при переписывании метода сравнения. Даже если E. equals (null) возвращает false, метод сравнения должен активно бросить NullPointerException Exception NullPointerException Null Pointer.
2. При внедрении сопоставимого класса для переписывания метода сравнения, результат e1.compareto (e2) == 0, как правило, необходимо соответствовать e1.equals (e2). Таким образом, в будущем при использовании контейнеров SortedSet и других сбора, отсортированных в соответствии с естественными классами, порядок сохраненных данных может быть обеспечено согласованным с воображением.
Некоторым людям может быть любопытно, что произойдет, если будет нарушена вторая точка выше?
Например, если вы добавляете два объекта A и B в сортируемый набор, AB удовлетворяет (! A.Equals (b) && a.compareto (b) == 0), и нет другого сравнения, тогда, когда вы добавите A, а затем B, он добавит false, и размер сортированного сет не увеличится, потому что в сортировке они одинаковы, а дублирование не разрешено в сортировке.
Фактически, результаты всех основных классов Java, которые реализуют сопоставимый интерфейс, согласуются с методом Eckyas.
Список или массивы, которые реализуют сопоставимый интерфейс, могут быть отсортированы с использованием методов collections.sort () или Arrays.sort ().
Только объекты, которые реализуют сопоставимый интерфейс, могут быть использованы непосредственно в качестве ключей SortedMap (SortedSet), в противном случае правила сортировки компаратора должны быть указаны снаружи.
Поэтому, если вы хотите использовать упорядоченные классы сбора для класса, который вы определяете себя, вам необходимо реализовать сопоставимый интерфейс, например:
**! частный int count; Публичный книжный бусс (название строки, int count) {this.name = name; this.count = count; } public String getName () {return name; } public void setName (string name) {this.name = name; } public int getCount () {return count; } public void setCount (int count) {this.count = count; } / ** * rewrite equals * @param o * @return * / @override public boolean equals (object o) {if (this == o) вернуть true; if (! (o экземпляр книжного буба)) вернуть false; Книжный бобы = (Книжный бассейн) o; if (getCount ()! = bean.getCount ()) вернуть false; return getName (). equals (bean.getName ()); } /*** Перепишите метод расчета хэшкода* Итеративный расчет на основе всех атрибутов, чтобы избежать дублирования* Коэффициент расчета 31 наблюдается при расчете хэшкода. Это основное число и не может быть снова разделен * @return */ @override public int hashcode () {// string string string (), который представляет только содержимое строки int result = getName (). Hashcode (); // умножьте на 31, плюс результат счета = 31 * Результат + getCount (); результат возврата; } @Override public String toString () {return "Bookbean {" + "name = '" + name +'/'' + ", count =" + count + '}'; } / ** * При добавлении книжного булока в Treeset этот метод будет вызван для сортировки * @param ore * @return * / @override public int compareto (объект другого) {if (другой экземпляр книжного буба) {Книжный штук = (Книжный бассейн) другой; int результат; // Например, сортировка по цене книги здесь result = getCount () - inotherbook.getCount (); // или следуйте строке порядок сравнения // result = getName (). CompareTo (oreverbokbook.getName ()); if (result == 0) {// Когда цена книги такая же, сравните заголовок. Убедитесь, что все атрибуты сравниваются Result = getName (). CompareTo (orthipBook.getName ()); } return Result; } // return 0 return 0; }Приведенный выше код также переписывал методы EckyS () и hashcode (). Пользовательские классы должны переписать эти методы, когда они хотят сравнить их.
При переписывании сравнения позже вам нужно судить, является ли определенный атрибут одинаковым, и сравнить все атрибуты один раз.
Сопоставимый интерфейс является частью структуры коллекций Java.
Comporator Custom Sort
Кораптор также является интерфейсом в пакете java.util. Перед JDK 1.8 было только два метода:
Общественный интерфейс компаратор <t> {public int compare (t lhs, t rhs); Public Boolean Equals (Object Object);}Многие новые методы были добавлены в JDK 1.8:
По сути, все они связаны с функцией, и новые дополнения к 1.8 не будут представлены здесь.
Из вышесказанного мы можем видеть, что использование естественной сортировки требует, чтобы классы для реализации сопоставимых, а метод сравнения перезаписывается внутренне.
Кораптор устанавливает правила сортировки извне и передает их определенным классам в качестве параметров политики сортировки, таких как collections.sort (), Arrays.sort () или некоторые внутренне упорядоченные коллекции (такие как сортировка, SortedMap и т. Д.).
Как его использовать в основном делится на три шага:
1. Создайте класс реализации интерфейса компаратора и назначить значение объекту
Написать правила сортировки для пользовательских классов в методе сравнения
2. Пропустите объект компаратора в качестве параметра методу класса сортировки
3. Добавьте пользовательский класс, используемый в методе сравнения с классом сортировки
Например:
// 1. Создать объект, который реализует интерфейс компаратора Comparator = new Compamator () {@Override public int compare (Object Object1, Object Object2) {if (object1 exanceof newbookbean && object2 ancementof newbookbean) {newbookbean newbookbean = (newbookbean) object1; Newbookbean Newbookbean1 = (Newbookbean) Object2; // См. Сравнение в естественной сортировке для конкретного метода сравнения, вот возвращение каштана newbookbean.getCount () - Newbookbean1.getCount (); } return 0; }}; // 2. Передайте этот объект в качестве формального параметра конструктору Treesset Treeset = New Treesset (компаратор); // 3. Добавьте объект класса, разработанный в методе сравнения на шаге 1 к деревьям, к деревьям reeset.add (Newbookbean («A», 34)); reeset.add (newbookbean ("s", 1)); reeset.add (Newbookbean ("V", 46)); reeset.add (Newbookbean ("Q", 26));На самом деле, мы видим, что использование компаратора является моделью стратегии. Студенты, которые не знакомы с моделью стратегии, могут нажать здесь, чтобы просмотреть: режим стратегии: узнайте о фиксированной рутине онлайн -романов.
Ссылка на интерфейс компаратора проводится в классе сортировки:
Компаратор <? Super K> компаратор;
Мы можем передать различные пользовательские правила сортировки классов реализации компаратора и сформулировать различные стратегии сортировки для одного и того же класса.
Суммировать
Два метода сортировки в Java:
Сравнимая естественная сортировка. (Реализация класса сущности)
Компаратор - это пользовательская сортировка. (Если класс объектов не может быть изменен, он создается непосредственно на вызывающем абоненте)
Когда он существует одновременно, он использует правила компаратора (пользовательская сортировка) для сравнения.
Для некоторых обычных типов данных (таких как String, Integer, Double ...) они реализуют сопоставимый интерфейс по умолчанию и реализуют метод сравнения, который мы можем использовать напрямую.
Для некоторых пользовательских классов им может потребоваться реализовать различные стратегии сравнения в разных ситуациях. Мы можем создать новый интерфейс компаратора, а затем сравнить его, используя конкретную реализацию компаратора.
Это разница между сопоставимым и компаратором.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!