java

Comparable, Comparator 에 관하여

키위먹고싶다 2021. 12. 12. 03:47
  • Comparable
    • java.lang package에 있는 인터페이스이다.
    • 객체의 정렬기준을 정해줄 때 사용한다.
    • Comparable 인터페이스의 구현체는 compareTo메서드를 구현해야 한다.
    • 자기 자신의 변수와 compareTo(Object o)로 넘어온 객체의 변수를 비교한다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class CompareTest {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("원숭이", 15, 60));
        list.add(new Person("토끼", 22, 44));
        list.add(new Person("코끼리", 34, 58));
        list.add(new Person("사자", 85, 85));
        list.add(new Person("굼뱅이", 7, 2));

        System.out.println(list);
        
        Collections.sort(list);
        System.out.println(list);
    }
}

class Person implements Comparable<Person>{
    String name;
    int age;
    int speed;

    Person(String name, int age, int speed){
        this.name = name;
        this.age = age;
        this.speed = speed;
    }

    public String toString(){
        return "[" + name + "," + age + "," + speed + "]";
    }

    @Override
    public int compareTo(Person o) {
        return o.age - this.age;    //나이 기준으로 내림차순
    }
}
  • Comparator
    • java.util package에 있는 인터페이스이다.
    • 이미 정해진 정렬기준 외 다른 정렬기준을 사용하고 싶을때 사용한다.
    • Comparator 인터페이스의 구현체는 compare메서드를 구현해야 한다.
    • Comparator 인터페이스의 구현체는 그 클래스 자체가 정렬기준이다.(외부정렬)
    • 만약 Comparable을 구현한 클래스의 정렬기준 외에 다른 정렬기준이 필요하다면 Comparator를 구현한 클래스를 정렬 기준으로 사용한다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class CompareTest {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("원숭이", 15, 60));
        list.add(new Person("토끼", 22, 44));
        list.add(new Person("코끼리", 34, 58));
        list.add(new Person("사자", 85, 99));
        list.add(new Person("굼뱅이", 7, 2));

        System.out.println(list);

        Collections.sort(list);
        System.out.println(list);

        Collections.sort(list, new SpeedUp());
        System.out.println(list);
    }
}

class SpeedUp implements Comparator<Person>{

    @Override
    public int compare(Person o1, Person o2) {
        return o1.speed - o2.speed; //스피드 기준으로 오름차순
    }
}

class Person implements Comparable<Person>{
    String name;
    int age;
    int speed;

    Person(String name, int age, int speed){
        this.name = name;
        this.age = age;
        this.speed = speed;
    }

    public String toString(){
        return "[" + name + "," + age + "," + speed + "]";
    }

    @Override
    public int compareTo(Person o) {
        return o.age - this.age;    //나이 기준으로 내림차순
    }
}