2018년 4월 3일 화요일

java Comparable vs Comparator

1. Comparable ( java.lang.Comparable )

https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html
클래스의 기본 정렬에 따라 정렬해주는 인터페이스이다.
Integer, Double 등 클래스의 경우는 오름차순으로, String 클래스의 경우 사전으로 정렬해준다.
return값이 0이나 음수이면 자리를 바꾸지않고, 양수이면 자리를 변경한다.
기본은 오름차순인데 내림차순으로 정렬하고 싶으면 변수의 순서를 바꿔주면 된다.

import java.util.Arrays;

public class Exam_sort {
    public static void main(String[] args) {
        Student student[] = new Student[5];
        //순서대로 "이름", 입학년도
        student[0] = new Student("KIM", 2012);
        student[1] = new Student("LEE", 2011);
        student[2] = new Student("CHO", 2015);
        student[3] = new Student("BAK", 2009);
        student[4] = new Student("PANG", 2017);

        Arrays.sort(student); //내부적으로 오버라이딩을 구현한 메소드를 호출한다.
        for(int i=0;i<5;i++) //toString에 정의된 형식으로 출력
            System.out.println(student[i]);
    }
}
class Student implements Comparable<Student> {

    String name; //이름
    int year; //입학년도
    public Student(String name, int year){
        this.name = name;
        this.year = year;
    }

    public String toString(){
        return "이름: "+name+", 입학년도 : "+year;
    }

    /*@Override
    public int compareTo(Student student) {
        //return Integer.compare(year, student.year); //입학년도 기준으로 오름차순 정렬
        //return Integer.compare(student.year, year); //입학년도 기준으로 내림차순 정렬
    }*/

    @Override
    public int compareTo(Student student) {
        return name.compareTo(student.name); // 이름순으로 기준으로 오름차순 정렬
        //return student.getName().compareTo(name); // 이름순으로 기준으로 내림차순 정렬
    }
}

2. Comparator ( java.util.Comparator )

https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
Comparable가 구현된 클래스에서 기본 정렬과는 다르게 원하는 방식으로 정렬해주는 인터페이스이다.

성적순으로 내림차순으로 정렬하면서 입학년도가 같을때 입학년도로 오름차순으로 정렬하고싶다면 어떻게 해야할까?
기본정렬과 다르게 정렬 하고싶을때 Comparator 를 이용하면 된다.


import java.util.Arrays;
import java.util.Comparator;

public class Exam_sort2 {
    public static void main(String[] args) {
        Student2[] Student2 = new Student2[5];
        //순서대로 "이름", 입학년도
        Student2[0] = new Student2("KIM", 2012, 4.1);
        Student2[1] = new Student2("LEE", 2011, 2.7);
        Student2[2] = new Student2("CHO", 2017, 3.5);
        Student2[3] = new Student2("BAK", 2009, 2.5);
        Student2[4] = new Student2("PANG", 2011, 3.5);

        Arrays.sort(Student2, new Comparator<Student2>(){
            public int compare(Student2 s1, Student2 s2) {
                double s1Grade = s1.grade;
                double s2Grade = s2.grade;
                if(s1Grade == s2Grade){ //입학년도가 같으면
                    return Integer.compare(s1.year, s2.year); //입학년도 오름차순
                }
                return Double.compare(s2.grade, s1.grade); //성적 내림차순
            }
        });

        for(int i=0;i<5;i++)
            System.out.println(Student2[i]);
    }
}

class Student2 implements Comparable<Student> {

    String name; //이름
    int year; //입학년도
    double grade; //학점
    public Student2(String name, int year, double grade){
        this.name = name;
        this.year = year;
        this.grade = grade;
    }

    public String toString(){
        return "이름: "+name+", 입학년도 : "+year+", 학번 : "+grade;
    }

    @Override
    public int compareTo(Student student) {
        return Integer.compare(year, student.year); //입학년도 기준으로 오름차순 정렬
    }

}

* GitHub

Share:

0 개의 댓글:

댓글 쓰기