Interface Comparable
class Rank implements Comparable<Rank>{
public String rank;
public int vote;
Rank(String rank, int vote){
this.rank = rank;
this.vote = vote;
}
@Override
public int compareTo(Rank o) {
int ret = (-1) * Integer.compare(this.vote, o.vote);
if(ret!= 0)
return ret;
ret = this.rank.compareTo(o.rank);
return ret;
}
}
List<Rank> list1 = new ArrayList<>();
list1.add(new Rank("A", 0));
list1.add(new Rank("B", 1));
list1.add(new Rank("C", 3));
list1.add(new Rank("D", 1));
Collections.sort(list1);
- compareTo() 메서드 작성법
- 현재 객체 < 파라미터로 넘어온 객체: 음수 리턴
- 현재 객체 == 파라미터로 넘어온 객체: 0 리턴
- 현재 객체 > 파라미터로 넘어온 객체: 양수 리턴
- 음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 바뀐다.
implements Comparable<Rank>
— Comparable을 구현할 때 일반적으로 따르는 패턴임. Rank의 참조는 Rank 참조와만 비교할 수 있다는 의미
Interface Comparator
List<Rank> list1 = new ArrayList<>();
list1.add(new Rank("A", 0));
list1.add(new Rank("B", 1));
list1.add(new Rank("C", 3));
list1.add(new Rank("D", 1));
Comparator<Rank> rankComparator = Comparator.comparing(Rank::getVote).reversed()
.thenComparing(Rank::getRank, String::compareTo);
list1.sort(rankComparator);
- Comparable을 구현하지 않은 필드나 표준이 아닌 순서로 비교해야 할 때 사용함
- 메서드 체이닝 형태로 Comparator 정의 가능함