JAVA/JAVA

Comparator와 Comparable

호두밥 2021. 10. 29. 10:13

Comparable

collecion 클래스에서 구성 요소를 정렬하는 기준을 정의하는 인터페이스입니다.

Collection의 요소가 사용자 정의 클래스인 경우에는 Comparable 인터페이스를 상속받아 구현되어야 합니다.

상속 받은 뒤에는 정렬기준을 정의하는 compareTo 메소드를 구현해야 합니다.(오버라이드)

메소드 리턴 설명
compareTo(T o) int o와 객체가 가진 값이 같으면 0을 리턴
o보다 객체가 가진 값이 크면 양수를 리턴
o보다 객체가 가진 값이 작으면 음수를 리턴

 

public class Student implements Comparable<Student>{
        int id ;
        int score;
        String name;

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

    @Override
    public int compareTo(Student o) {
        return this.score - o.score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", score=" + score +
                ", name='" + name + '\'' +
                '}';
    }
}
 public static void main(String[] args) {

        List<Student> students = new LinkedList<>();
        students.add(new Student(1, 90, "AAA"));
        students.add(new Student(2, 100, "BBB"));
        students.add(new Student(3, 70, "CCC"));
        students.add(new Student(4, 80, "DDD"));
        System.out.println(students.toString());

        Collections.sort(students);

        System.out.println(students.toString());


}
// score 기준으로 정렬 전
[Student{id=1, score=90, name='AAA'}, Student{id=2, score=100, name='BBB'}, Student{id=3, score=70, name='CCC'}, Student{id=4, score=80, name='DDD'}]

// score 기준으로 정렬 후
[Student{id=3, score=70, name='CCC'}, Student{id=4, score=80, name='DDD'}, Student{id=1, score=90, name='AAA'}, Student{id=2, score=100, name='BBB'}]

 

Comparator

만약 사용자 정의 클래스에 compareTo가 정의되어 있지 않다면 Comparator 익명 객체를 선언하여 정렬 기준을 정의할 수 있습니다. 정렬하는 기능 메소드인 Collections.sort와 Arrays.sort를 호출하는 시점에 Comparator 객체를 선언하여 사용할 수 있습니다.

  

public class Student{
        int id ;
        int score;
        String name;

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

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", score=" + score +
                ", name='" + name + '\'' +
                '}';
    }
}
public static void main(String[] args) {

        List<Student> students = new LinkedList<>();
        students.add(new Student(1, 90, "AAA"));
        students.add(new Student(2, 100, "BBB"));
        students.add(new Student(3, 70, "CCC"));
        students.add(new Student(4, 80, "DDD"));
        System.out.println(students.toString());

		//comparator 정의
        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.score - o2.score;
            }
        });

        System.out.println(students.toString());
    }
// score 기준으로 정렬 전
[Student{id=1, score=90, name='AAA'}, Student{id=2, score=100, name='BBB'}, Student{id=3, score=70, name='CCC'}, Student{id=4, score=80, name='DDD'}]

// score 기준으로 정렬 후
[Student{id=3, score=70, name='CCC'}, Student{id=4, score=80, name='DDD'}, Student{id=1, score=90, name='AAA'}, Student{id=2, score=100, name='BBB'}]

 

Comparator에 Lambda(람다식)를 사용하기

 public static void main(String[] args) {

        List<Student> students = new LinkedList<>();
        students.add(new Student(1, 90, "AAA"));
        students.add(new Student(2, 100, "BBB"));
        students.add(new Student(3, 70, "CCC"));
        students.add(new Student(4, 80, "DDD"));
        System.out.println(students.toString());

//      람다식을 이용해 구현하기 
        Collections.sort(students, ((o1, o2) -> {return o1.score - o2.score;}));

        System.out.println(students.toString());


    }

'JAVA > JAVA' 카테고리의 다른 글

Optional  (0) 2021.11.07
스트림 Stream  (0) 2021.11.07
Lambda Expressions 람다식  (0) 2021.10.28
Collection 컬렉션  (0) 2021.10.25
제어문(조건문 if, 반복문 for/while)  (0) 2021.10.07