Comparable, Comparator

97ben·2022년 2월 16일
0

Comparable, Comparator란?

Comparable, Comparator 모두 인터페이스이며
객체정렬에 필요한 메서드가 정의되어있다.

Comparable

public interface Comparable {
	int compareTo(Object o);
}

매개변수로 주어진 객체 o를 객체 본인과 비교한다.
compareTo의 값이 음수이면 왼쪽보다 오른쪽이 크다는것이다. 양수이면 오른쪽이 왼쪽보다 크다. 0이면 같다.

Comparator

public interface Comparator{
	int compare(Object o1, Object o2);
}

기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용
compare의 값이 음수이면 왼쪽보다 오른쪽이 크다는것이다. 양수이면 오른쪽이 왼쪽보다 크다. 0이면 같다.

예제를 살펴보자,
키와 몸무게가 주어진 여러 사람들이 있다.
이 사람들을 키가 큰 순서대로 정렬하고 키가 같을시 몸무게가 작은 순서대로 정렬하는 방법은?

1. 2차원 배열 + Comparator

package feb16;

import java.util.Arrays;
import java.util.Comparator;

public class test {

	public static void main(String[] args) {
		int[][] arr = {{160, 58}, {180, 80}, {160, 49}};
		
		Arrays.sort(arr, new myorder());	// myorder2() 도 가능
		System.out.println(Arrays.deepToString(arr));
	}

	public static class myorder implements Comparator<int[]>{
		@Override
		public int compare(int[] o1, int[] o2) {
			return o1[0] == o2[0] ? (o1[1] - o2[1]) : o2[0] - o1[0]; 
		}
	}
	
	public static class myorder2 implements Comparator{

		@Override
		public int compare(Object o1, Object o2) {
			
			if(o1 instanceof int[] && o2 instanceof int[]) {
				int[] o11 = (int[])o1;
				int[] o22 = (int[])o2;
				
				return o11[0] == o22[0] ? o11[1] - o22[1] : o22[0] - o11[0]; 
			}
			return -1;
		}
		
	}
	
}

이런식으로 Integer 타입의 2차원 배열로 사람들의 키랑 몸무게를 담아서
Comparator를 구현하는 클래스를 만들어서 사용할 수 있다.
대신 이러한 방법은 Comparable은 사용하지 못한다.

2. 2차원 배열 + Comparable

package feb16;

import java.util.Arrays;

public class test2 {

	public static class Person implements Comparable<Person>{
		public int height;
		public int weight;
		
		
		public Person(int height, int weight) {
			this.height = height;
			this.weight = weight;
		}
		@Override
		public int compareTo(Person o) {
			return this.height == o.height ? this.weight - o.weight : o.weight - this.weight;
		}
		@Override
		public String toString() {
			return "Person [height=" + height + ", weight=" + weight + "]";
		}
		
	}
	
	public static void main(String[] args) {
		
		Person[] parr = new Person[3];
		parr[0] = new Person(160, 58);
		parr[1] = new Person(180, 80);
		parr[2] = new Person(160, 49);
		
		Arrays.sort(parr);
		
		for (int i = 0; i < 3; i++) {
			System.out.println(parr[i]);
		}

	}

}

이처럼 클래스를 이용하면 기본적으로 comparable 을 사용할수 있다.
이게 실제로 알고리즘 코딩테스트를 풀때 가장 많이 사용하는 방법이다.

3. 2차원 배열 + Comparator

package feb16;

import java.util.Arrays;
import java.util.Comparator;

public class test3 {

	public static class Person {
		public int height;
		public int weight;

		public Person(int height, int weight) {
			this.height = height;
			this.weight = weight;
		}

		@Override
		public String toString() {
			return "Person [height=" + height + ", weight=" + weight + "]";
		}

	}

	public static void main(String[] args) {

		Person[] parr = new Person[3];
		parr[0] = new Person(160, 58);
		parr[1] = new Person(180, 80);
		parr[2] = new Person(160, 49);

		Arrays.sort(parr, new Myorder());

		for (int i = 0; i < 3; i++) {
			System.out.println(parr[i]);
		}

	}
	
	public static class Myorder implements Comparator<Person>{

		@Override
		public int compare(Person o1, Person o2) {
			return o1.height == o2.height ? o1.weight - o2.weight : o2.weight - o1.weight;
		}
		
	}

}

아니면 이런식으로 클래스를 사용하더라도
따로 Comparator를 구현하는 클래스를 만들어서 사용할수도 있다.

profile
현명한개발자가되자

0개의 댓글