저는 현재 노래 모음을 정렬하라는 프로젝트를 진행하고 있습니다. 이 질문에 제시된 솔루션을 사용하여이를 수행하고 약간 수정합니다. 개체 컬렉션 정렬
import java.util.Comparator;
public class SongComparator implements Comparator<Song> {
public enum Order {
YEAR_SORT, RANK_SORT, ARTIST_SORT, TITLE_SORT
}
public Order sortingBy;
@Override
public int compare(Song song1, Song song2) {
switch (sortingBy) {
case YEAR_SORT:
return Integer.compare(song1.year, song2.year);
case RANK_SORT:
return Integer.compare(song1.rank, song2.rank);
case ARTIST_SORT:
return song1.artist.compareTo(song2.artist);
case TITLE_SORT:
return song1.title.compareTo(song2.title);
}
throw new RuntimeException(
"Practically unreachable code, can't be thrown");
}
public void setSortingBy(Order sortBy) {
this.sortingBy = sortingBy;
}
}
정렬 방법의 예 :
public void sortTitle() {
SongComparator comparator = new SongComparator();
SongComparator.Order sortingBy = SongComparator.Order.TITLE_SORT;
Collections.sort(songs2, comparator);
}
sortingBy
각 sortField
메서드가 실행될 때 변수 를 변경 하여 올바른 비교 메서드를 실행할 수 있기를 바랍니다. 그러나 메서드에서 정의하는 방식은 클래스 sortingBy
의 변수를 전혀 변경하지 않고 새 변수를 만드는 SongComparator
것입니다.
sortingBy
비교기 필드를 설정하지 않았습니다 .
comparator.setSortingBy(sortingBy);
Collections.sort(songs2, comparator);
이 값을 생성자 매개 변수로 전달하여 비교기가 항상 유효한 상태인지 확인하고 버그를 재현하지 않는 것이 좋습니다.
SongComparator comparator = new SongComparator(SongComparator.Order.TITLE_SORT);
Collections.sort(songs2, comparator);
그런데이 sortingBy
필드는 공개되어서는 안되며 필드에 대한 setter가 없어야 sortingBy
합니다.
클래스를 더 쉽고 친숙하게 사용하기 위해 팩토리 메서드를 만들 것입니다.
public static SongComparator byTitle() {
return new SongComparator(SongComparator.Order.TITLE_SORT);
}
public static SongComparator byYear() {
return new SongComparator(SongComparator.Order.YEAR_SORT);
}
...
호출자의 코드는 다음과 같습니다.
Collections.sort(songs2, SongComparator.byTitle());
Java 8에서는이 비교기 클래스가 필요하지 않습니다. 당신은 단순히 사용할 수 있습니다
Collections.sort(songs2, Comparator.comparing(Song::getTitle));
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다