TIL/JAVA

[TIL] Comparator와 Comparable

Dream COM Ddulut 2024. 11. 25. 23:45

1. Comparable

기본 정렬 순서를 정의할 때 사용

package: java.lang

Comparable 인터페이스 내부에 int compareTo() 메서드가 정의되어있음

• 클래스에 implements 해서 구현, 객체의 기본 정렬 방법을 정의

여러 가지 정렬 기준을 정하기는 어려움

import java.util.*;

class Student implements Comparable<Student> {
    private String name;
    private int age;

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

    @Override
    public int compareTo(Student other) {
        return this.age - other.age; // 나이 기준 오름차순 정렬
    }

}

1-1. CompareTo의 메커니즘

String Class에서 CompareTo 메서드는 두 문자열을 사전식으로 비교

또한 String Class에서 compareTo 메서드는 final 메서드로, 오버라이딩 할 수 없음

[비교 메커니즘]
1. 첫 번째 문자부터 순차적으로 두 문자열의 각 문자를 비교
2. 두 문자가 다른경우 (유니코드 값)ASCII 값을 기준으로 비교 결과 반환
      ex) "Alice"와 "Bob"을 비교할 때,  'A'가 'B'보다 작으므로 음수 값을 반환
3. 두 문자가 같으면 길이를 비교하여 결과 값을 반환

1-2. CompareTo의 비교

오름차순 비교 - s1.compareTo(s2)

• s1이 s2보다 사전적으로 앞에 오면 음수 반환

s1과 s2가 같으면 0 반환

• s1이 s2보다 사전적으로 뒤에 오면 양수 반환

"Apple".compareTo("Banana")  // 음수 반환
"Banana".compareTo("Apple")  // 양수 반환
"Apple".compareTo("Apple")   // 0 반환

 

내림차순 비교 - s2.compareTo(s1)

• s2가 s1보다 사전적으로 앞에 오면 음수 반환

 s2와 s1이 같으면 0 반환

 s2가 s1보다 사전적으로 뒤에 오면 양수 반환

"Apple".compareTo("Banana")  // 양수 반환
"Banana".compareTo("Apple")  // 음수 반환
"Apple".compareTo("Apple")   // 0 반환

2. Comparator

특정 정렬 순서를 정의할 때 사용

package: java.util

int compare(T o1, T o2)

별도의 클래스 또는 익명 클래스로 구현하여 사용

int compare(T o1, T o2); //o1: 비교할 첫 번째 객체. o2: 비교할 두 번째 객체.
class AgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        return Integer.compare(s1.getAge(), s2.getAge());
    }
}

 

2-1. compare 메서드의 메커니즘

o1<o2 (o1이 o2보다 먼저 와야함 의미) : 음수 반환

o1==o2 : 0 반환

o1>o2 ( o1이 o2의 뒤에 와야함 의미 ) : 양수 반환

 

① 오름차순

Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);  // 오름차순
    }
});

 

② 내림차순

Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);  // 내림차순
    }
});

3. Comparator에서 compareTo를 사용할 수 있는 경우

  String이나 Integer 같은 클래스들은 이미 Comparable을 구현하고 있으므로,
   Comparator에서 compareTo를 사용하여 비교할 수 있다.

  즉, 비교할 객체가 Comparable을 구현하고 있는 경우 Comparator에서 compareTo를 호출할 수 있다.