Разница между естественным и общим порядком - PullRequest
40 голосов
/ 07 февраля 2012

Я случайно сталкиваюсь со многими утверждениями, например, что сопоставление используется, когда требуется естественное упорядочение при сортировке массива или коллекции и компаратора для общего упорядочения.то же самое значение, но в конечном счете это один из отличительных факторов между ними (компаратор и сопоставимые интерфейсы).

Но я нигде не смог найти различий между этими двумя типами упорядочения.Буду признателен, если кто-нибудь объяснит это хорошим примером:)

Ответы [ 7 ]

28 голосов
/ 07 февраля 2012

Общий порядок означает, что все значения можно сравнить со всеми другими значениями. Например, если у вас есть коллекция BigDecimal и String, то нет естественного итогового заказа (но вы можете изобрести один)

В Java естественный порядок определяется как порядок, предоставляемый JVM. Это может не соответствовать тому, что люди могут считать естественным порядком. например Строки сортируются ASCIIbetically. значение Z предшествует a, а 10 предшествует 2

http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

Этот интерфейс накладывает полное упорядочение на объекты каждого класса, который его реализует. Этот порядок называется естественным порядком класса, а метод CompareTo класса называется его естественным методом сравнения.

10 голосов
/ 07 февраля 2012

Общий порядок является общей математической концепцией.Он отличается в основном от частичного упорядочения тем, что для каждого a и b в наборе X , либо " a <= b </em>", либо " b <= a</em>"значимы и верны.Что касается Java, это означает, что из двух Comparable экземпляров один должен быть больше или равен другому (т. Е. Имеет смысл сравнивать их).

8 голосов
/ 23 июня 2012

Важный момент: натуральный порядок должен быть в соответствии с равным !

Резюме: натуральный порядок равен единицевид общего порядка, который используется по умолчанию (используется чаще всего) для данного класса и согласуется с равными.Общий порядок - это любой порядок, в котором все значения можно сравнить со всеми другими значениями.

например, при разработке нового класса вы можете выбрать естественный порядок внутри класса.Любой другой порядок может быть только тот, который только один;)

8 голосов
/ 07 февраля 2012

Естественный порядок

Это зависит от того, какие коллекции мы используем, например, у нас есть объект символов, тогда естественный порядок - это их значения в Юникоде, для чисел естественный порядок, как обычно, в порядке возрастания

Comparable Interface - этот интерфейс накладывает полное упорядочение на объекты каждого класса, который его реализует.Это упорядочение называется естественным упорядочением класса, а метод CompareTo класса - его естественным методом сравнения.

Списки (и массивы) объектов, которые реализуют этот интерфейс, могут автоматически сортироваться Collections.sort.(и Arrays.sort).Объекты, которые реализуют этот интерфейс, могут использоваться как ключи в отсортированной карте или элементы в отсортированном наборе, без необходимости указывать компаратор.

public interface Comparable<T> {

    /**
     * Compares this object with the specified object for order.  Returns a
     * negative integer, zero, or a positive integer as this object is less
     * than, equal to, or greater than the specified object.
     */
    public int compareTo(T o);
}

Интерфейс компаратора:

Этот интерфейс Представляетотношение порядка, которое может использоваться для сортировки списка или поддержания порядка в отсортированном наборе или карте.Может переопределять естественное упорядочение типа или упорядочивать объекты типа, который не реализует интерфейс Comparable.

Функция сравнения, которая накладывает общее упорядочение на «некоторую коллекцию объектов».Компараторы могут быть переданы в метод сортировки (например, Collections.sort), чтобы обеспечить точный контроль над порядком сортировки.Компараторы также могут использоваться для управления порядком определенных структур данных (таких как TreeSet или TreeMap).

    public interface Comparator<T> {
    /**
     * Compares its two arguments for order.  Returns a negative integer,
     * zero, or a positive integer as the first argument is less than, equal
     * to, or greater than the second.
     */
    int compare(T o1, T o2);

    boolean equals(Object obj);
}

Hope This helps you.                    
5 голосов
/ 22 ноября 2017

Чтобы уточнить ответ @ Бруно: пример частичного упорядочения - это отношение делимости между положительными числами. Если вы сравните 5 и 15, вы можете сказать, что 5 - это делитель 15, а 15 - это кратное 5. Однако 3 и 5 не сравнимы, потому что 3 не является ни делителем, ни кратным 5.

Примером общего порядка является меньше отношения , потому что если вы берете любые два разных числа, одно из них меньше другого. Таким образом, любое значение сопоставимо с любым другим значением.

О концепции естественного упорядочения : Если объекты типа имеют действительно очень очевидный способ сортировки, то это естественное упорядочение. Например, естественный порядок строк - это алфавитный порядок, а естественный порядок чисел - возрастающий, потому что это первый выбор, о котором можно подумать. Однако иногда вы захотите заказать строки по-другому, например, сортировка по длине от 1 до более длинных. Это возможный общий порядок строк, но не естественный.

Не все объекты обязательно имеют естественный порядок. Например. если у вас есть объекты Person, сортировка их по высоте - это возможный общий порядок, но сортировка по возрасту возможна ... Ни один из них не является более очевидным, чем другой, поэтому естественного порядка нет.

4 голосов
/ 07 февраля 2012

Естественный порядок - общий порядок по умолчанию. Это единственное различие между ними.

0 голосов
/ 18 июня 2018
Реализации

Comparable обеспечивают естественное упорядочение для класса, что позволяет автоматически сортировать объекты этого класса. (Ссылка: https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html)

Реализация интерфейса Comparable обеспечивает общее упорядочение или возможность сортировать весь массив от начала до конца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...