Здравствуйте, изучаю книгу 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
. Таким образом песни при использовании этого компаратора будут отсортированы лексикографически по именам исполнителей.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Есть TextView, в который помещаю 3 словаДлина 3-х слов велика, НО надо их уместить в одну строчку
Я хочу написать свой собственный Task для antВроде бы нашел на Apache Ant Как пишутся свои Task'и
В однопоточных системах единственный поток управления выполняется в бесконечном цикле, опрашивая единственную очередь событий, чтобы принять...