클래스가 정렬돼야 할 기준(오름차순/내림차순)이 하나인 경우 클래스가 Comparable
인터페이스를 구현하도록 설계할 수 있다. Comparable
을 구현하고 있는 클래스는 정렬이 가능하다는 것을 의미한다.
클래스.sort() 로 배열을 정렬할 때, Comparator를 지정해주지 않으면 저장하는 객체는 주로 Comparable을 구현한 클래스의 객체에 구현된 내용에 따라 정렬된다.
[기존 코드]
기본 정렬기준이 아닌 "Monster의 게임이 끝난 뒤, 최종 전진위치(fowardPosition)"를 기준으로 sort하여 ranking
(ArrayList)에 저장하기 위해서 Comparator
를 구현하였다.
private void rank() {
Comparator<Monster> comparator = Comparator.comparing(Monster::getForwardPosition);
ranking = monsters.stream().sorted(comparator.reversed()).collect(Collectors.toList());
}
[리팩토링 계획]
현재 Monster
클래스가 정렬돼야 할 기준은 하나이다. forwardPosition(전진위치)가 높은 순서로 정렬을 한다.
Monster
클래스가 Comparable
인터페이스를 구현하도록 설계해보자
abstract class Monster implements Comparable<Monster> { ... }
compareTo()
메서드를 구현해줘야 한다.Monster anotherMonster
: compareTo의 매개변수로 비교대상이 될 다른 Monster 객체를 받는다.
비교 기준이 될 Monster의 forwardPosition은 int 형으로, 기존의 Integer 클래스의 compareTo를 이용해서 비교해주도록 하였다.
this.getForwardPosition
으로 forwardPostion값을 가져와 Integer로 변환 후, compareTo()에는 매개변수로 받은 다른 Monster의 forwardPosition 값을 넣어주면된다.
@Override
public int compareTo(Monster anotherMonster) {
return ((Integer) anotherMonster.getForwardPosition()).compareTo((Integer) this.getForwardPosition()); //내림차순 정렬
return ((Integer) this.getForwardPosition()).compareTo((Integer) anotherMonster.getForwardPosition()); //오름차순 정렬
}
개선된 코드
@Override
public int compareTo(Monster anotherMonster) {
return Integer.compare(anotherMonster.getForwardPosition(), this.getForwardPosition()); //내림차순
// return Integer.compare(this.getForwardPosition(), anotherMonster.getForwardPosition()); //오름차순
}
실행결과
몬스터 Racing 결과가 랭킹순으로 출력된다.
참고