본문 바로가기

Java/기본

[Java] 컬렉션프레임워크201 - Comparable, Comparator

Arrays.sort(), List의 sort() 메서드를 사용하면 정렬이 자동으로 이루어진다. 근데 이 방법은 오름차순으로 밖에 정렬되지 않기 떄문에 다른 정렬기준이 필요한 경우 그 기준을 제시할 필요가 있다. 그때 사용하는 것이 바로comparable 인터페이스, comparator 인터페이스이다.

 

인터페이스 패키지 내용
Comparable java.util 형식 : A compareTo( B )
리턴 : compareTo 결과. 현재 객체가 크다면 1,  같다면 0,  작다면 -1 리턴
Comparator java.lang 형식 : compare(A, B)
리턴 : compare 결과. A가 크다면 1,  같다면 0,  작다면 -1 리턴

 


Comparable

 

코드 예제

먼저 Comparable 인터페이스를 구현하고, compareTo() 메서드를 재정의(오버라이드)하여 새로운 기준을 제시한다.

아래의 경우 20세 미만은 출입할 수 없도록 하는 기준을 새로 정의한 Comparable 구현객체이다.

 

compareTo() 메서드는 Object 객체, 즉 모든 객체를 받도록 되어있다. 비교하기 전에 비교 기준에 맞는 인스턴스 타입인지 확인이 필요하다. instance of 연산자를 사용해 기준에 맞는 Object 타입만 비교하도록 설정한다

public class Age_Comparable implements Comparable{
    //compareTo 메서드를 오버라이드하여 재정의
    @Override
    public int compareTo(Object o) {
        int result = 0;
        //숫자로 들어온 경우에 기준이 발동되도록 설정
        if(o instanceof Integer){
            int age =  (Integer) o;
            if(age > 19){
                System.out.println("환영합니다");
                result = 1;
            } else{
                System.out.println("입장 하실 수 없습니다");
                result = -1;
            }
            return result;
        }
        System.out.println("나이는 숫자를 넣어주세요");
        return 0;
    }
}

 

아래 코드를 보면 앞서 Comparable 을 구현한 Age_Comparable 클래스를 new 로 선언하여 기준으로 삼을 객체를 가져오고 있다. 여기에 값을 대입하여 새로운 기준에 대한 리턴값을 받아온다.

public class Test {
    public static void main(String[] args) {
        Age_Comparable comparable = new Age_Comparable();

        int age1 = 12;
        int age2 = 24;
        String age3 = "20";

        int result01 = comparable.compareTo(age1);
        System.out.println(result01);

        int result02 = comparable.compareTo(age2);
        System.out.println(result02);

        int result03 = comparable.compareTo(age3);
        System.out.println(result03);

        /*
        입장 하실 수 없습니다
        -1
        환영합니다
        1
        나이는 숫자를 넣어주세요
        0
        */
    }
}

 

 


Comparator

 

코드 예제

먼저 Comparator 인터페이스를 구현하고, compare() 메서드를 재정의(오버라이드)하여 새로운 기준을 제시한다.

 

아래의 경우 두번째 인자값이 첫번째 인자값의 2배에 해당되는지 비교하는 예제이다. 먼저 instance of 연산자를 사용해 숫자인지 확인하고, 2배에 해당하면 1(=true), 2배에 해당되지 않는다면 0(=false), 나머지는 -1(=error)를 리턴한다.

import java.util.Comparator;

public class ComparatorEx implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        //리턴할 변수 선언
        int result = -1;
        if(o1 instanceof Integer && o2 instanceof Integer){

            //비교를 위해 형변환하여 int형 변수에 값 대입하기
            int int01 = (int) o1;
            int int02 = (int) o2;

            if(int01*2 == int02){
                result = 1;
            } else {
                result = 0;
            }
        }
        return result;
    }
}

 

public class Test {
    public static void main(String[] args) {
        ComparatorEx comp = new ComparatorEx();

        int result01 = comp.compare(4, 6);
        int result02 = comp.compare(3, 6);
        int result03 = comp.compare("test", 6);

        System.out.println(result01);   //0
        System.out.println(result02);   //1
        System.out.println(result03);   //-1
    }
}