기계는 거짓말하지 않는다

Comparable / Comparator 본문

Java

Comparable / Comparator

KillinTime 2021. 5. 23. 16:05

- Comparable

comparable 인터페이스는 compareTo 메서드를 오버라이딩 해야한다.

class에 인스턴스 변수가 여러 개일 경우 기준이 필요하다.

이 메서드 구현으로 순서 판단 기준을 결정한다. 매개변수 1개이며 sort 메서드 사용 시 기준이 된다.

import java.util.Arrays;

class Data implements Comparable<Data> {
	int num;
	String str;
	
	Data(int num, String str) {
		this.num = num;
		this.str = str;
	}
	
	@Override
	public int compareTo(Data d) {
		if(num != d.num) {
			return num - d.num;		// 오름차순, 반대면 내림차순
		}
		else {
			return str.compareTo(d.str);	// num이 같을 경우 str로 오름차순
		}
	}
	
	@Override
	public String toString() {
		return num + " " + str;
	}
}

public class Test {
	public static void main(String[] args) {
		Data[] dataArr = new Data[5];
		
		dataArr[0] = new Data(5, "AB");
		dataArr[1] = new Data(5, "BC");
		dataArr[2] = new Data(5, "CDA");
		dataArr[3] = new Data(7, "ASD");
		dataArr[4] = new Data(10, "JK");
		
		Arrays.sort(dataArr);
		
		for(Data d : dataArr) {
			System.out.println(d);
		}
	}
}

실행 결과

num을 기준으로 오름차순, 같을 경우 str을 기준으로 오름차순 한다.

- Comparator

comparator 인터페이스는 compare 메서드를 오버라이딩 해야한다.

class 자체가 정렬 기준이며 따라서 매개변수를 2개 받아야한다.

Collections의 sort를 사용하여 Comparator를 구현한 class를 이용하고 List를 받는다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Data{
	int num;
	String str;
	
	Data(int num, String str) {
		this.num = num;
		this.str = str;
	}
	
	@Override
	public String toString() {
		return num + " " + str;
	}
}

class SortData implements Comparator<Data> {
	@Override
	public int compare(Data d1, Data d2) {
		if(d1.num != d2.num) {
			return d2.num - d1.num;		// 내림차순, 반대면 오름차순
		}
		else {
			return d2.str.compareTo(d1.str);	// num이 같을 경우 str로 내림차순
		}
	}
}

public class Test {
	public static void main(String[] args) {
		ArrayList<Data> dataArr = new ArrayList<>(5);
		
		dataArr.add(new Data(5, "AB"));
		dataArr.add(new Data(5, "BC"));
		dataArr.add(new Data(5, "CDA"));
		dataArr.add(new Data(7, "ASD"));
		dataArr.add(new Data(10, "JK"));
		
		Collections.sort(dataArr, new SortData());
		
		for(Data d : dataArr) {
			System.out.println(d);
		}
	}
}

실행 결과

내림차순 정렬 결과이다.

Comments