2010-12-04 3 views
0

В книге, которую я читал (Head First Java) заявил, что, когда я звоню Collections.sort(myList) (где myList является ArrayList<Song> объект и Song класс реализует интерфейс Comparable<Song>) метод compareTo() будет называться по одной Song объект, передающий это Song ссылку на другой Song.Java Сопоставимые <T> интерфейс

я просто не могу, как это проходит ссылку на разныеSong, как он может знать о других один?

+0

Что на ваш вопрос именно? – 2010-12-04 19:59:57

ответ

1

Он захватывает пары песен из ArrayList и передает один на .compareTo другого.

0

Это первая песня из списка, вторая, и вызывает song1.compareTo(song2), где song1 - первая песня, а song2 - вторая. Возможно, вы захотите реализовать любой алгоритм сортировки вручную.

0

Способ сортировки объектов, чтобы как-то сравнить их со всеми остальными. Таким образом, вы можете взять первую песню в списке и сравнить ее с каждой из других песен, пока не найдете, где она идет. Затем нужно решить, куда идет вторая песня, сравнивая ее со всеми другими песнями и т. Д. Это описывает алгоритм сортировки вставки, но вы получаете идею ...

1

Представьте, что не было такой вещи, как Collection, и у вас было написать свой собственный sort() метод с нуля. Попробуем это с помощью (глупо медленного, но понятного) алгоритма сортировки пузырьков. В общем, это выглядит примерно так:

for (int i = 0; i < myList.length; i++) { 
    for (int j = i; j < myList.length; j++) { 
     if (myList[i] < myList[j]) { 
      Song temp = myList[i]; 
      myList[i] = myList[j]; 
      myList[j] = temp;; 
     } 
    } 
} 

Конечно, не будет работать. Вам нужна функция для сравнения двух объектов и определения того, какой из них больше. Таким образом, фактический код будет выглядеть так:

if (myList[i].compareTo(myList[j]) < 0) { 

И есть ваши два объекта песни: объект, на котором вы вызываете метод (myList[i]) и объект вы передаете в качестве параметра.

0

Вы всегда сравниваете две песни (разные или нет, не имеет значения). Смотрите следующий пример:

 

package edu.androidnoob.test.comparable; 

import java.util.List; 

public class ComparableTester { 

    public static void main(String[] args) { 
    List songs = new ArrayList(); 
    songs.add(new Song("Poker Face")); 
    songs.add(new Song("November Rain")); 
    System.out.println("Are songs different? " 
     + (songs.get(0).compareTo(songs.get(1)) != 0)); 
    System.out.println("Are songs different? " 
     + (songs.get(0).compareTo(songs.get(0)) != 0)); 
    } 

    private static final class Song implements Comparable<Song> { 
    private String name; 

    public Song(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public int compareTo(Song song) { 
     return this.name.compareTo(song.getName()); 
    } 

    } 

} 
 

И посмотреть результат:

 
Are songs different? true 
Are songs different? false 
Смежные вопросы