본문 바로가기

알고리즘

16. [JAVA] Comparable

저번 글에서 

 

Sort (정렬) 에 관한 포스팅을 다뤘다

 

그러면서 Comparable에 대해서 다뤘었는데 이게 뭘까

 

어떻게 사용할까라는 의문이 들꺼라고 생각한다

 

그러면 알아보자

 

 

[좋은 블로그 발견]

 

https://wonit.tistory.com/143

 

[알고리즘 문제 풀이 스킬] 자바 에서 Comparator, Comparable 로 정렬 기준 바꾸기 (람다를 이용해서 깔

Java에서 comparable로 정렬 기준 바꾸기 [Java 심화] Java 에서 Comparable로 정렬 기준 바꾸기. Java에서 comparator로 정렬 기준 바꾸기 자바로 알고리즘 문제풀이를 하다 보면 특정 조건에 의한 정렬을 수행

wonit.tistory.com

 

https://blue-boy.tistory.com/182

 

[Java 01] Comparator 사용하기

1. Comparator  Comparator를 사용하려면 Array나 List Collectons일때 가능하다. 정렬기준을 Arrays.sort()나 Collections.sort()에서 사용가능하다. 내가 정의한 정렬기준에 대해서 배열과 List Collection을..

blue-boy.tistory.com


 

Comparable 란??

 

 

정렬을 사용할 때 사용하는 인터페이스이다

 

JAVA에서 기본적으로 제공하는 모든 정렬은 Comparable을 구현하고 있다

 

Arrays.sort

Collections.sort

 

같은것들 말이다

 

 

그렇다면 Comparable 인터페이스를 구현하게 되면

 

어떤 메소드를 Override 해야하냐하면

 

바로 compareTo( ) 라는 int 반환형의 메소드를

 

구현해줘야하는데

 

해당 메소드에서 반환하는 값에 따라서 순서를 바꿀지 안바꿀지를 정하게 된다고 보면 된다

 

만약 return 값으로

 

양수를 반환하면 작은 값이 앞에 있기에 그대로 정렬을 이어나가게 되고

 

0을 반환하면 비교하는 두 값이 같다는 의미

 

음수를 반환하면 앞에 값이 더 큰기 때문에 순서를 바꿔주게 된다

 

 

자세한 사항은 코드를 보도록 하자

 

 


 


import Algorithm.One.Player;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {


    public static void main(String[] args) throws IOException {

       ArrayList<Book> list = new ArrayList<Book>();

       list.add(new Book("총균쇄", "제레미 다이아몬드", "문학사상",2005));
       list.add(new Book("총균쇄", "제레미 다이아몬드", "문학사상",2000));
       list.add(new Book("파타고니아", "파도가 칠때는", "리본",2010));
       list.add(new Book("파타고니아", "파도가 칠때는", "리본",2001));
       list.add(new Book("동물농장", "피타고라서", "그리스",2007));
       list.add(new Book("동물농장", "피타고라스", "그리스",2015));

       Collections.sort(list);

       for(int i = 0; i < list.size(); i++){
           System.out.println(list.get(i).getYear() + " " + list.get(i).getTitle() + " " + list.get(i).getCompany());
       }

    }
}

class Book implements Comparable<Book>{

    private String title;
    private String author;
    private String company;
    private int year;

    public Book(String title, String author, String company, int year) {
        this.title = title;
        this.author = author;
        this.company = company;
        this.year = year;
    }

    public String getTitle() {
        return title;
    }

    public int getYear() {
        return year;
    }

    public String getCompany() {
        return company;
    }

    @Override
    public int compareTo(Book o) {

        // 연도로 오름차순 정렬

        if(this.year == o.year){
            return 0;
        }else if(this.year < o.year){
            return -1;
        }else{
            return 1;
        }

        --------------------------------------------------------

        // 책 제목으로 오름차순 정렬
        // 단 책 제목이 같을 시 연도로 정렬

        int res = this.getTitle().compareTo(o.getTitle());
        if(res == 0){
            res = this.getYear() - o.getYear();
        }
        return res;

        ------------------------------------------------------------

        // 회사명으로오름 차순정리
        // 회사명이 동일할시 책제목으로 정렬, 책 제목도 같을 시 연도별로 정렬

        int res = this.getCompany().compareTo(o.getCompany());

        if(res == 0){
            res = this.getTitle().compareTo(o.getTitle());

            if(res == 0){
                res = this.getYear() - o.getYear();
            }
        }

        return res;
    }
}

s

주목해야할 점은 2가지 이다

 

 

1.implements Comparable<Book>

 implements Comparable<Book>

 

해당 부분에서 Comparable이라는 인터페이스를 상속받아서 사용하게 된다

 

그렇게 되면 아래의 2번 메소드를 반드시 구현해줘야한다

 

 

2. comparTo(Book o)

@Override
public int compareTo(Book o)

 

구현한 메소드가 중요하다

 

주목할 점은 메소드 안에 들어가는 매개변수이다

 

비교할 데이터가 들어있는 VO 클래스를 매개변수로 넣고 해당 클래스를 기준으로 비교하게 되는데

 

this를 사용해서 이용하는게 일반적이다

 

1. 숫자형 데이터 정렬

 

가장 기본적인 숫자형 데이터 int 데이터를 비교하는 정렬 방식이다

 

if(this.year == o.year){
    return 0;
}else if(this.year < o.year){
    return -1;
}else{
    return 1;
}

현재 데이터인 this.year

비교할 앞의 데이터인 o.year

 

을 비교해서 큰지 작은지 같은지를 비교해서 return 해주도록 한다

 

 

2. 문자형 데이터 정렬

 

문자열은 그렇다면 어떤식으로 비교하는지 알아보자

 

 

int res = this.getCompany().compareTo(o.getCompany());

if(res == 0){
    res = this.getTitle().compareTo(o.getTitle());

    if(res == 0){
        res = this.getYear() - o.getYear();
    }
}

 

보다 시피 compareTo 메소드를 한번 더 활용해서 사용하게 된다

 

구조를 이해할 수는 없었지만

 

앞의 this.getCompany 와 o.getCompany의 문자열을

 

사전상 누가 앞에있는지를 비교해서 정렬해준다고 한다

 

 


 

해당 Compart 인터페이스를 활용하는 방법은 무궁무진하고

 

내가 코드를 만들면 사용하기 굉장히 좋은 정렬 알고리즘을 만들 수 있을꺼 같다