2016-03-19 2 views
0

Я новичок в Java и пытаюсь изучить метод Collections.sort(). Я увидел код ниже из Java Tutorial Oracle. После того, как метод Collections.sort() вызывается в классе NameSort, массив имен был отсортирован в соответствии с их именем и фамилией. Но я не вижу, что метод hashcode() класса Name, equals() или compareTo() был вызван в любом месте. Как метод Collections.sort() фактически работает под ним? Может ли кто-нибудь объяснить это мне? Заранее благодарю за любую помощь!Как метод Collections.sort() сортирует массив экземпляра класса «Имя» без вызова метода класса «Имя»?

Имя класса

public class Name implements Comparable<Name> { 
    private final String firstName, lastName; 

    public Name(String firstName, String lastName) { 
     if (firstName == null || lastName == null) 
      throw new NullPointerException(); 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String firstName() { return firstName; } 
    public String lastName() { return lastName; } 

    public boolean equals(Object o) { 
     if (!(o instanceof Name)) 
      return false; 
     Name n = (Name) o; 
     return n.firstName.equals(firstName) && n.lastName.equals(lastName); 
    } 

    public int hashCode() { 
     return 31*firstName.hashCode() + lastName.hashCode(); 
    } 

    public String toString() { 
    return firstName + " " + lastName; 
    } 

    public int compareTo(Name n) { 
     int lastCmp = lastName.compareTo(n.lastName); 
     return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName)); 
    } 
} 

NameSort класс

public class NameSort { 

    public static void main(String[] args) { 
     Name[] nameArray = { 
      new Name("John", "Smith"), 
      new Name("Karl", "Ng"), 
      new Name("Jeff", "Smith"), 
      new Name("Tom", "Rich") 
     }; 
     List<Name> names = Arrays.asList(nameArray); 
     Collections.sort(names); 
     System.out.println(names); 


    } 
} 

ответ

0

Как метод Collections.sort() сортирует массив экземпляра класса «Имя» без вызова метода класса «Имя»?

Это не так. Фактически, он вызывает метод compareTo, когда ему нужно сравнить пару объектов Name. javadoc для Collections.sort(List) говорит:

«Сортирует указанный список в порядке возрастания, в соответствии с natural ordering его элементов все элементы списка должны реализовывать интерфейс Comparable..»

Интерфейс Comparable определяет метод compareTo который обеспечивает «естественный порядок», что относится к Javadoc. Вот что делает Name для поддержки сортировки и т. Д. (equals, hashCode и toString) не используются для сортировки.

0

Две вещи, чтобы заметить:

1) Ваш класс Name реализует Сопоставимые интерфейс.

2) У этого метода compareTo.

Когда вы передаете arrayList имен в класс Collections, он внутренне выполняет итерацию по каждому элементу в списке и сравнивает их друг с другом, вызывая этот метод compareTo().

+0

Большое спасибо за полезный комментарий! Не могли бы вы объяснить это немного подробнее, например, как метод equals() и hashCode() использовался для сортировки заказов? Или как работают методы equal(), hashCode() и compareTo() для выполнения задания? В очередной раз благодарим за помощь! –

+2

Если вы внимательно посмотрите на метод compareTo(), вы заметите, что метод equals() и hashCode() не принимает участия в механизме сортировки вашей программы. Это фактически сравнение объектов на основе функции Java Strings compareTo: int lastCmp = lastName.compareTo (n.lastName); – rahsan

+1

Методы 'equals' и' hashCode' класса 'Name' не используются. Класс 'Name' основан на методе' compareTo' класса 'String'. Взгляните на https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-, чтобы узнать, что происходит, когда метод 'compareTo'' String' называется –

0

Javadoc для метода Collections.sort() уже детали реализации, в частности:

Реализация Примечание: Эта реализация сдвинуто метода list.sort (компаратор), используя указанный список и нуль компаратор ,

И Javadoc для List.sort() состояний:

Реализация Примечание:

Эта реализация является устойчивой, адаптивной, итеративной слиянием, что требует гораздо меньше, чем п Л.Г. (п) сравнений когда входной массив частично отсортирован, предлагая производительность традиционного объединения , когда входной массив упорядочен случайным образом. Если входной массив почти отсортирован, реализация требует приблизительно n сравнений. Требования временного хранения варьируются от небольшой константы для почти отсортированных входных массивов до n/2 ссылок на объекты для случайных упорядоченных массивов ввода.

Реализация принимает одинаковое преимущество по возрастанию и убыванию заказывает в своем массиве ввода и может использовать по возрастанию и по убыванию в разных частях одного и того же входного массива. Это , хорошо подходящий для слияния двух или более отсортированных массивов: просто объедините массивы и отсортируйте полученный массив.

Реализация была адаптирована для сортировки списка Тима Петерса для Python (TimSort). Он использует приемы из Питера Макилра «Оптимистической Сортировки и информации Теоретико сложности», в Трудах четвертой ежегодной ACM-SIAM симпозиума по дискретным алгоритмам, С. 467-474, января 1993

Чтобы лучше почувствуйте, как используются методы compareTo() и т. д., вы также можете добавить конкретный оператор трассировки System.out.println(...) в каждом из них, снова запустить свою программу и посмотреть результат.

Если вам действительно нужны все детали, вы должны будете также смотреть на source code for List.sort()

Смежные вопросы