Day6

피오·2021년 11월 8일
0
post-thumbnail

특정 클래스(A)의 인스턴스가 담긴 ArrayList를 정렬하고 싶었다. 정렬 기준을 주기 위해 Comparable 인터페이스를 사용해보려고 했으나 일단 놔뒀다. 그래도 오늘 다시 학습했으니 기록으로 남겨본다.


배열(컬렉션 포함)을 sort메서드로 정렬할 때의 정렬 기준을 제시하는 방법에는 두 가지가 있다.

Comparable

  • 기본 정렬기준을 구현하는 데 사용한다.
  • 사용법
    정렬 대상(A) 클래스 선언부에 implements Comparable<T>을 선언하고 compareTo 추상메서드를 오버라이딩하여 내가 원하는 기본 정렬기준을 제시해줄 수 있다..
  public class LedgerItem implements Comparable<LedgerItem> {
  	...
  
  	@Override
  	public int compareTo(LedgerItem o) {
  		return this.order - o.order;
  	}
  }
  • 위와 같이 Comparable을 구현한 클래스는 sort메서드로 정렬할 때 따로 정렬 기준(Comparator)을 제시하지 않아도 된다. 기본 정렬 기준을 제시해줬으니까 sort내부적으로 compareTo를 호출해서 정렬한다.
List<LedgerItem> items = new ArrayList<>();
//...items를 채우고...
Collections.sort(items); 

Comparator

  • 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용한다.
  • 사용법
    정렬 기준으로 사용할 클래스의 선언부에 implements Comparator를 선언하고 compare메서드를 선언한다.
class ClassName implements Comparator {
	public int compare(Object o1, Object o2) {
		//Comparable인터페이스를 구현한 클래스의 compareTo메서드처럼 음수, 0, 양수를 리턴하도록 구현한다.
        	...
        	return 양수 or 음수 or 0;
	}
}

위와 같이 Comparator를 구현한 후 sort메서드를 호출할 때 인자로 넘겨준다. 이때에도 sort메서드 내부적으로 compare메서드를 호출해서 정렬하게 된다.

List<LedgerItem> items = new ArrayList<>();
//...items를 채우고...
Collections.sort(items, new ClassName()); 


참고

profile
블로그 이전했습니다. https://pzbg.tistory.com/

0개의 댓글