connecting the dots

Java의 Comparable와 Comparator 인터페이스 차이 본문

language/Java

Java의 Comparable와 Comparator 인터페이스 차이

林 : 2021. 3. 19. 03:11

 

알고리즘 문제를 풀다보면 여러가지 우선순위에 따라 정렬을 해야하는 경우가 생기는데, 이 때 코드를 그대로 짜다보면 더 오래걸리기도 하고 코드 길이도 너무 길어지는 경향이 있다.

 

또한 알고리즘 뿐만 아니라 자바로 개발을 할 때 꼭! 알아야 하는 Comparable와 Comparator에 대해 포스팅하며 개념을 정리하고자 한다.

 

 

 

차이점

Comparable

  • 클래스의 기본 정렬 기준을 설정하는 인터페이스
  • Comparable 인터페이스를 implements 하고, 내부에 있는 compareTo 메소드를 원하는 정렬 기준대로 구현
  • 비교대상 객체 내부에 생성하므로 compareTo 매개변수 하나

 

Comparator

  • 기본 정렬 기준과는 다르게 정렬하고 싶을 때 이용하는 클래스
  • Comparator 클래스를 생성해 내부에 compare 메소드를 원하를 정렬 기준대로 구현
  • 비교대상 객체 외부에 생성하므로 compare 매개변수 둘

 

 

 

 

Comparable 예제

 

 

1. x의 오름차순으로 정렬

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

public class ComparableTest {
	private static class Node implements Comparable<Node> {
		int x;
		int y;

		Node(int x, int y) {
			this.x = x;
			this.y = y;
		}

		@Override
		public int compareTo(Node o) {
			return this.x - o.x;
		}
	}

	public static void main(String[] args) {
		ArrayList<Node> list = new ArrayList<>();

		list.add(new Node(3, 5));
		list.add(new Node(2, 0));
		list.add(new Node(6, 1));

		Collections.sort(list);

		for (Node node : list) {
			System.out.println("(" + node.x + "," + node.y + ")");
		}
	}
}

 

 

 

2. x의 내림차순으로 정렬

		@Override
		public int compareTo(Node o) {
			return o.x - this.x;
		}

1번과 동일한 코드에서 return 값만 순서를 바꾸어주면 된다.

 

 

 

3. value가 큰 것부터 정렬, 만약 value가 동일하면 x가 큰게 먼저

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

public class ComparableTest {
	private static class Node implements Comparable<Node> {
		int x;
		int y;
		int value;

		Node(int x, int y, int value) {
			this.x = x;
			this.y = y;
			this.value = value;
		}

		@Override
		public int compareTo(Node o) {
			int diff = o.value - this.value;
			return diff == 0 ? o.x - this.x : diff;
		}
	}

	public static void main(String[] args) {
		ArrayList<Node> list = new ArrayList<>();

		list.add(new Node(3, 5, 6));
		list.add(new Node(2, 0, 5));
		list.add(new Node(6, 1, 1));
		list.add(new Node(3, 2, 1));

		Collections.sort(list);

		for (Node node : list) {
			System.out.println("(" + node.x + "," + node.y + "," + node.value + ")");
		}
	}
}

 

 

 

Comparator 예제

 

1. name의 오름차순으로 정렬

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

class Node {
	String name;
	int age;

	public Node(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

}

class sortByName implements Comparator<Node> {
	@Override
	public int compare(Node o1, Node o2) {
		return o1.name.compareTo(o2.name);
	}
}

public class ComparatorTest {

	public static void main(String[] args) {
		ArrayList<Node> list = new ArrayList<>();

		list.add(new Node("Tommy", 25));
		list.add(new Node("Jenny", 17));
		list.add(new Node("Army", 30));

		Collections.sort(list, new sortByName());

		for (Node node : list) {
			System.out.println("(" + node.name + "," + node.age + ")");
		}
	}
}

 

 

 

2. name의 내림차순으로 정렬

class sortByName implements Comparator<Node> {
	@Override
	public int compare(Node o1, Node o2) {
		return o2.name.compareTo(o1.name);
	}
}

1번의 해당 부분에서 o1와 o2의 위치를 바꿔준다.

'language > Java' 카테고리의 다른 글

Java의 접근지정자(public, protected, default, private)  (0) 2021.01.27