String, Integer, Double 등 클래스 내부에는 모두 compare 메소드가 내장 되어있다.
기본적으로 오름차순으로 제공하고 있다. 만약 내림차순으로 정렬을 하고 싶다면, 매개변수의 순서를 바꿔주면 된다.
이 int compare 메서드를 간단히 설명하자면, 정렬이 진행될 때 자리바꿈(=정렬) 여부를 결정하는 값을 넘겨주는 역할을 한다.
만약 return값이 0이나 음수이면 자리바꿈을 하지 않고, 양수이면 자리바꿈을 수행한다.
만약 오름차순이 아니라 내림차순으로 정렬하고 싶다면 매개변수의 순서를 바꿔주면 된다.
compare 메소드 코드
@Override
public static int compare(int x, int y) {
return x < y ? -1 : ((x == y) ? 0 : 1);
}
사용 예 :
int a = 10;
int b = 5;
System.out.println(Integer.compare(a, b)); // 1
1) Comparable 인터페이스
- 정의: 정렬 수행시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의해 놓는 인터페이스이다.
- 사용법: Comparable 인터페이스를 implements 한 뒤, 내부에 있는 compareTo 메서드를 원하는 정렬 기준대로 구현하여 사용할 수 있다.
- 패키지: java.lang.Comparable
- 자바에서 제공되는 정렬이 가능한 클래스들은 모두 Comparable 인터페이스를 구현하고 있으며, 정렬시에 Comparable의 구현 내용에 맞춰 정렬이 수행된다.
예를들어 Integer, Double 등의 클래스의 경우 비 내림차순(오름차순과 유사), String 클래스의 경우 사전순으로 정렬되게 구현되어 있다.
public class Car implements Comparable<Car> {
private String car;
private int price;
public Car(String name , int price){
this.name = name;
this.price = price;
}
// getter, setter method ...
@Override
public int compareTo(Car car){
int comparePrice = car.getPrice();
return this.price - comparePrice;
}
}
import java.util.Arrays;
public class CarTestDrive
{
public static void main(String[] args)
{
Car[] cars = new Car[3];
cars[0] = new Car("Genesis", 1000);
cars[1] = new Car("Sonata" , 600);
cars[2] = new Car("Avante" , 300);
Arrays.sort(cars);
for(Car car : cars){
System.out.println(car.getName());
}
}
}
실행 결과 (오름차순)
Avante
Sonata
Genesis
만약, 내림차순으로 정렬하고 싶다면, 오버라이딩한 compareTo메소드 return값을 음수로 줘버리면 된다.
public int compareTo(Car car){
int comparePrice = car.getPrice();
return -(this.price - comparePrice);
//또는 comparePrice - this.price; 이렇게 반대로 해줘도 된다.
}
이렇게 실행하면, 아래의 결과처럼 내림차순으로 나온다.
Genesis
Sonata
Avante
2) Comparator 클래스
- 정의: 정렬 가능한 클래스(=Comparable이 구현된 클래스)들의 기본 정렬 기준과는 다른 방식으로 정렬하고 싶을 때 사용하는 클래스이다.
- 사용법: Comparator 클래스를 생성하여, 내부에 compare메서드를 원하는 정렬 기준대로 구현하여 사용할 수 있다.
- 패키지: java.util.Comparator
- 주로 익명클래스(new Comparator(){ ... })로 사용되며, 기본적으로 오름차순이 정렬 기준인 것을 내림차순으로 정렬하는 등의 용도로 사용된다.
import java.util.Arrays;
import java.util.Comparator;
public class CarTestDrive
{
public static void main(String[] args)
{
Car[] cars = new Car[3];
cars[0] = new Car("Genesis", 1000);
cars[1] = new Car("Sonata" , 600);
cars[2] = new Car("Avante" , 300);
Arrays.sort( cars , new Comparator<Car>() {
@Override
public int compare(Car car1, Car car2){
return car1.getName().compareTo(car2.getName());
}
});
for(Car car : cars){
System.out.println(car.getName());
}
}
}
실행 결과
Avante
Genesis
Sonata
만약, 좌표의 크기를 비교 한다면?
(1, 2) 와 (1, 1)을 오름 차순으로 정렬을 할 경우. (x가 작은 순서로, x가 같을 때는 y가 작은 순서)
정렬 전
1 2
1 1
---------
정렬 후
1 1
1 2
이럴 경우에는 Comparator 를 구현 하면 된다.
public class Main {
public static void main(String[] args) {
Dot[] dots = new Dot[2];
dots[0] = new Dot(1, 2);
dots[1] = new Dot(1, 1);
Arrays.sort(dots, new Comparator<Dot>() {
@Override
public int compare(Dot o1, Dot o2) {
if (o1.getX() == o2.getX()) { // 만약, x가 같으면
return Integer.compare(o1.getY(), o2.getY()); // y를 비교한다.
}
return Integer.compare(o1.getX(), o2.getX()); // o1.x가 크면 자리를 바꾼다.
}
});
}
public static class Dot {
int x , y;
public Dot(int x, int y){
this.x = x;
this.y = y;
}
//getter, setter
}
}