본문 바로가기
알고리즘/개념정리

자바 정렬하기

by 새싹감자 2022. 9. 12.

Comparable, Comparator는 둘다 객체를 비교하기 위해서 사용한다.

이 두 인터페이스를 사용한다면 우리가 원하는 기준을 만들어서 객체를 비교할 수 있게된다.

본질적으로 객체는 사용자가 기준을 정해주지 않는 이상 어떤 객체가 더 높은 우선순위를 갖는지 판단 할 수기 때문이다.

그렇다면 Comparable, Comparator 두개의 차이는 무엇일까?

Comparable은 "자기 자신과 매개변수 객체를 비교" 한다.

Comparator는 "두 매개변수 객체를 비교" 한다.

 

공식문서는 다음과 같다.

 

[Comparable]

docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#method.summary

 

Comparable (Java Platform SE 8 )

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method. Lists (and arrays) of o

docs.oracle.com

 

[Comparator]

docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary

 

Comparator (Java Platform SE 8 )

Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. In the foregoing description, the notation sgn(expression) designates the mathematical s

docs.oracle.com

 

 

Comparable


interface Comparable

T자리에는 비교하고 싶은 객체의 타입이 들어가면 된다.

  class Book implements Comparable<Book> {

int number; 
int bookname; 

Book(int number, int bookname) {
    this.number = number;
    this.bookname = bookname;
}

@Override
public int compareTo(Book o) {

    // 자기자신의 number가 o의 number보다 크다면 양수
    if(this.number > o.number) {
        return 1;
    }
    // 자기 자신의 number와 o의 number가 같다면 0
    else if(this.number == o.number) {
        return 0;
    }
    // 자기 자신의 number가 o의 number보다 작다면 음수
    else {
        return -1;
        }
    }
}

이코드는 이렇게 간결하게 바꿀 수 있다.

 

Comparator


comparator는 두개의 인수를 받아서 비교할 수 있다.
코드는 아래와 같다.

    public int compare(Book o1, Book o2) {

        return o1.classNumber - o2.classNumber;
    }

이때, comparator를 사용하기 위해서는 익명의 객체가 하나 더 필요하다.
테스트클래스에서 우리는 Book a 객체를 만들어서 a.compare(a,b) a.compare(b,c) 와 같은 형태로 사용해야 한다.
이를 방지하기 위해 익명 객체를 사용한다.

        Comparator<Book> comp1 = new Comparator<Book>() {
            @Override
            public int compare(Book o1, Bookt o2) {
                return o1.number - o2.number;
            }
        };

이렇게 하면 comp1.compare(a,b) 같은 식으로 코드를 활용할 수 있다.

 

정렬


이를 활용한 정렬 알고리즘을 짜보자.
두 수를 비교한 값이
음수일 경우 : 두 원소의 위치를 교환 안함
양수일 경우 : 두 원소의 위치를 교환 함

Arrays.sort()는 Comparator또한 파라미터로 받는다.
Arrays.sort(array, comp) 형식으로 작성하는게 가능하다는 것이다.

이를 활용해 이차원배열을 정렬해보았다.
우선 기준은 배열의 첫번째 원소로 잡고, 만약 첫번째 원소가 같다면 두번째 원소를 기준으로 정렬한다.

    Arrays.sort(num, (o1, o2) -> {
        if(o1[0] == o2[0]) {
            return o1[1] - o2[1];
        } else {
            return o1[0] - o2[0];
        }
    });

 

'알고리즘 > 개념정리' 카테고리의 다른 글

서로소 집합 만들기  (1) 2022.09.20
순열, 조합  (0) 2022.09.12
BFS,DFS  (0) 2022.08.11
객체 배열  (0) 2022.08.09
Java 시간초과 날 때  (0) 2022.08.03

댓글