본문 바로가기
면접 대비 프로그래밍 지식/프로그래밍 언어

[JAVA] Comparable과 Comparator

by 기초백과 2021. 2. 15.

자바에서는 배열이나 콜렉션의 정렬을 할때 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