connecting the dots
Java의 Comparable와 Comparator 인터페이스 차이 본문
알고리즘 문제를 풀다보면 여러가지 우선순위에 따라 정렬을 해야하는 경우가 생기는데, 이 때 코드를 그대로 짜다보면 더 오래걸리기도 하고 코드 길이도 너무 길어지는 경향이 있다.
또한 알고리즘 뿐만 아니라 자바로 개발을 할 때 꼭! 알아야 하는 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 |
---|