2 minute read

몰랐다면 180만개 row를 버블 정렬이라도 하려 했던,,, 그래서 다행인 포스팅

0. 들어가기전에

음 자바가 보면 볼수록 편리한 기능이 많은것 같다..

까먹은건가?? 애초에 몰랐던건가?..

아무튼 차례는 아래와 같다.

  1. 기본 정렬!!
  2. Comparable?
  3. Comparator?
  4. Example

1. 기본 정렬

그냥 일반적으로 책을 보는 예제는 아래와 같은 정렬이였을 것이다.

import java.util.Arrays;

public class ArrayApplication {

    public static void main(String[] args) {
        int[] numbersArray = {1, 10, 2, 5, 4};
        Arrays.sort(numbersArray);
        System.out.println(Arrays.toString(numbersArray));
        // 1,2,4,5,10

    }

}
import java.util.Arrays;

public class ArrayExample {

    public static void main(String[] args) {
        String[] names = {"맨유", "맨시티", "첼시"};
        Arrays.sort(names);
        System.out.println(Arrays.toString(names));
        // 맨시티 맨유 첼시
    }
}
   

그렇다면 위의 것들이 짬봉되어 numberArray 배열이 각 names 의 점수가 되면 어떻게 될까?

그리고 그 점수 대로 정렬을 하고 싶다면??

더 나아가 이름은 오름차순 그리고 점수는 내림차순으로 정렬을 하고 싶다면 어떻게 해야될까?

이모든게 아래 인터페이스들을 통해 가능하다.

2. Comparable 인터페이스

객체의 정렬 기준을 정의하는 첫번째 방법은 ! 자바에서 제공하는 Comparable 인터페이스를 구현하도록 변경하는것이다. 이를 적용하면 위의 1 마지막의 문제를 쉽게 해결 가능하다.

public class PrimierLeague implements Comparable<PrimierLeague>{

    private String teams;
    private int scores;

    public PrimierLeague() {
    }

    public PrimierLeague(String teams, int scores) {
        this.teams = teams;
        this.scores = scores;
    }

    public String getTeams() {
        return teams;
    }

    public void setTeams(String teams) {
        this.teams = teams;
    }

    public int getScores() {
        return scores;
    }

    public void setScores(int scores) {
        this.scores = scores;
    }

    @Override
    public int compareTo(PrimierLeague o) {
        return o.scores - scores;
    }

}

Comparable 인터페이스의 compareTo 메서드를 통해 인자로 넘어온 같은 타입의 다른 객체(o.scores)와 대소 비교가 가능, 메서드를 호출하는 객체가 인자로 넘어온 객체보다 작을 경우에는 음수를 리턴하고, 크기가 동일하면 0, 클경우 에는 양수를 리턴한다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ArrayExample {

    public static void main(String[] args) {

        List<PrimierLeague> ligueTables = new ArrayList<PrimierLeague>();
        PrimierLeague mu = new PrimierLeague("맨유",60);
        PrimierLeague mc = new PrimierLeague("맨시",70);
        PrimierLeague cs = new PrimierLeague("첼시",65);

        ligueTables.add(mu);
        ligueTables.add(mc);
        ligueTables.add(cs);

        System.out.println(ligueTables);

        //팬심의 점수는 아님을 미리 말씀드립니다.
        Collections.sort(ligueTables);

        System.out.println(ligueTables);
    }
    //[PrimierLeague{teams='맨유', scores=60}, PrimierLeague{teams='맨시', scores=70}, PrimierLeague{teams='첼시', scores=65}]
    //[PrimierLeague{teams='맨시', scores=70}, PrimierLeague{teams='첼시', scores=65}, PrimierLeague{teams='맨유', scores=60}]

}

오,, 굿,, 편하다,,

3. Comparator 객체 사용

만약 정렬 대상 클래스의 코드를 직접 수정할 수 없는 경우에는 어떻게 객체의 정렬 기준을 정의할 수 있을까? 또 정렬 하고자 하는 객체에 이미 정렬 기준이 있을때, 기준과 다른 정렬을 하고 싶다면 어떻게 해야 할까??

이때 필요한 것이 Comparator 인터페이스이다.

Comparator 인터페이스 구현체를 Array.sort()나 Collection.sort() 와 같은 정렬 메서드의 추가 인자로 넘기면 정렬 기준을 누락된 클래스의 객체나 기존 정렬 기준을 무시한체, 새로운 정렬 기준으로 객체를 정렬할 수 있다.

Comparator<Player> comparator = new Comparator<Player>() {
    @Override
    public int compare(Player a, Player b) {
        return b.getScore() - a.getScore();
    }
};

Collections.sort(players, comparator);
System.out.println(players); // [Player(name=Chloe, score=1090), Player(name=Eric, score=1018), Player(name=Bob, score=982), Player(name=Dale, score=982), Player(name=Alice, score=899)]

Categories:

Updated: