자바에서는 배열이나 콜렉션의 정렬을 할때 sort라는 메소드를 통해 간단하게 정렬을 할 수 있다.
그러나 String, int, float 등의 자료형은 비교가 가능하지만
사용자가 정의한 클래스를 단순히 비교할 수가 없어
Comparable과 Comparator를 통해 비교하는 기준을 만들어 주어야 한다.
두 개의 인터페이스는 비슷한 역할을 하지만 사용되는 용도에는 이러한 차이가 있다.
Comparable - 해당 인터페이스를 구현한 클래스에 한 가지 기본 정렬 규칙을 부여하기 위함
Comparator - 해당 인터페이스를 구현한 클래스는 정렬 규칙 그 자체이며, 기본 정렬 규칙 이외의
기준으로 정렬을 하기 위함이다.
sort 메소드에서는 오름차순과 내림차순을 정할 수가 있다.
Comparator.naturalOrder() - 오름차순
Comparator.reverseOrder() - 내림차순
비교를 위해 구현되야 하는 CompareTo와 Compare 에서는
자신과 인자로 전달 받는 타 원소와 비교해 정수를 리턴한다.
- 음수 결과 : 타 원소가 크다
- 0 결과 : 둘이 같다
- 양수 결과 : 자신이 크다
Comparable 예시 코드
public class Pencil implements Comparable<Pencil> {
int price, length;
public Pencil(int price, int length) {
super();
this.price = price;
this.length = length;
}
@Override
public int compareTo(Pencil o) {
// TODO Auto-generated method stub
return this.price - o.price;
}
@Override
public String toString() {
return "Pencil [price=" + price + ", length=" + length + "]";
}
}
Comparator 예시 코드
public class CompareLength implements Comparator<Pencil> {
@Override
public int compare(Pencil o1, Pencil o2) {
// TODO Auto-generated method stub
return o1.length - o2.length;
}
}
메인 메소드
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Pencil> pencilList = new ArrayList<>();
for(int i = 0; i<5; i++)
pencilList.add(new Pencil((int)(Math.random()*5+1)*100,(int)(Math.random()*5 +1)));
System.out.println("초기 리스트 출력");
for(Pencil p : pencilList)
System.out.println(p);
System.out.println();
pencilList.sort(Comparator.naturalOrder());
System.out.println("가격 기준 오름차순 출력");
for(Pencil p : pencilList)
System.out.println(p);
System.out.println();
pencilList.sort(Comparator.reverseOrder());
System.out.println("가격 기준 내림차순 출력");
for(Pencil p : pencilList)
System.out.println(p);
System.out.println();
pencilList.sort(Comparator.reverseOrder());
pencilList.sort(new CompareLength());
System.out.println("길이 기준 오름차순 출력");
for(Pencil p : pencilList)
System.out.println(p);
System.out.println();
}
'면접 대비 프로그래밍 지식 > 프로그래밍 언어' 카테고리의 다른 글
[JAVA]람다식 (0) | 2021.02.09 |
---|---|
[JAVA] 컬렉션(Collection) 정리 (0) | 2021.02.09 |