Java. Comparator

268
21 декабря 2016, 00:04

Здравствуйте, изучаю книгу Head First Java и дошел до примера с использованием компаратора в коллекциях. Пример из книги:

package Jukebox3;
import java.io.*;
import java.util.*;
class Song  {
    String title;
    String artist;
    String rating;
    String bpm;
    public int compareTo(Song s) {
        return title.compareTo(s.getTitle());
    }
    Song(String t, String a, String r, String b) {
        title = t;
        artist = a;
        rating = r;
        bpm = b;
    }
    public String getTitle() {
        return title;
    }
    public String getArtist() {
        return artist;
    }
    public String getRating() {
        return rating;
    }
    public String getBpm() {
        return bpm;
    }
    public String toString() {
        return title;
    }
}
public class Jukebox3 {
    ArrayList<Song> songList = new ArrayList<>();
    public static void main(String[] args) {
        new Jukebox3().go();
    }
    class ArtistCompare implements Comparator<Song> {
        public int compare(Song one, Song two) {
            return one.getArtist().compareTo(two.getArtist());
        }
    }
    public void go() {
        getSongs();
        ArtistCompare artistCompare = new ArtistCompare();
        Collections.sort(songList, artistCompare);
        System.out.println(songList);
    }
    void getSongs() {
        try  {
            File file = new File("SongList.txt");
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line = null;
            while((line = reader.readLine()) != null) {
                addSong(line);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    void addSong(String lineToParse) {
        String[] tokens = lineToParse.split("/");   
        Song nextSong = new Song(tokens[0], tokens[1], tokens[2], tokens[3]);
        songList.add(nextSong);
    }
}

Как работает этот метод:

void addSong(String lineToParse) {
        String[] tokens = lineToParse.split("/");   
        Song nextSong = new Song(tokens[0], tokens[1], tokens[2], tokens[3]);
        songList.add(nextSong);
    }

У нас в файле 5 строк, эти пять строк мы разбиваем на 4 части и добавляем в массив. Далее создаем новый объект Song и добавляем его в коллекцию ArrayList<Song>. И т.к. строк в файле 5, то и объектов в коллекции будет соответственно тоже 5. Правильно ли я понял в этом месте?

Далее идет компаратор:

class ArtistCompare implements Comparator<Song> {
        public int compare(Song one, Song two) {
            return one.getArtist().compareTo(two.getArtist());
        }
    }

Он сравнивает 2 объекта, но объектов у нас 5, как он сравнит остальные? Помогите пожалуйста, совсем туго доходит :(

Answer 1

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

Например, для чисел таким приоритетом является само значение числа: при сортировке по возрастанию среди любых двух чисел меньшее будет ближе к началу коллекции, большее - ближе к концу.

Компаратор ArtistCompare из вашего примера сравнивает две песни по значениям строкового поля artist. Таким образом песни при использовании этого компаратора будут отсортированы лексикографически по именам исполнителей.

READ ALSO
Преобразования в TextView

Преобразования в TextView

Есть TextView, в который помещаю 3 словаДлина 3-х слов велика, НО надо их уместить в одну строчку

325
Реализация своего собственного Task&#39;a для Ant в java

Реализация своего собственного Task'a для Ant в java

Я хочу написать свой собственный Task для antВроде бы нашел на Apache Ant Как пишутся свои Task'и

387
Однопоточные и многопоточные системы

Однопоточные и многопоточные системы

В однопоточных системах единственный поток управления выполняется в бесконечном цикле, опрашивая единственную очередь событий, чтобы принять...

325