Здравствуйте, изучаю книгу 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, как он сравнит остальные? Помогите пожалуйста, совсем туго доходит :(
Компараторы используются для сортировки объектов в коллекции. Задача компаратора - сравнить два элемента и сказать, какой из них имеет приоритет над другим (говоря формальным языком, установить отношение порядка между ними). Алгоритм сортировки на шаге сортировки применяет компаратор к двум значениям и решает, в каком порядке поместить их в коллекцию.
Например, для чисел таким приоритетом является само значение числа: при сортировке по возрастанию среди любых двух чисел меньшее будет ближе к началу коллекции, большее - ближе к концу.
Компаратор ArtistCompare из вашего примера сравнивает две песни по значениям строкового поля artist. Таким образом песни при использовании этого компаратора будут отсортированы лексикографически по именам исполнителей.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости