Java Comparable <T>интерфейс - PullRequest
       19

Java Comparable <T>интерфейс

0 голосов
/ 04 декабря 2010

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

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

Ответы [ 5 ]

1 голос
/ 04 декабря 2010

Представьте, что не существует такой вещи, как 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;;
        }
    }
}

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

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

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

1 голос
/ 04 декабря 2010

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

0 голосов
/ 04 декабря 2010

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


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
0 голосов
/ 04 декабря 2010

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

0 голосов
/ 04 декабря 2010

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

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