본문 바로가기

JAVA

Comparable, Comparator 어떻게 쓰지? JAVA

둘 다 객체를 정렬할 때 사용하는 Interface입니다.

 

알고리즘 문제를 풀다보면, 자주 접하게 되는 부분이라 한 번 정리를 하고 넘어갈까 합니다😀

Comparable

정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메소드를 정의하는 인터페이스

java.lang.Comparable

 

Java에서 제공되는 정렬이 가능한 클래스들은 모두 Comparable 인터페이스를 구현하고 있으며, 정렬 시에

정의된 대로 정렬이 수행됩니다.

 

public final class Integer extends Number implements Comparable<Integer> { ... }

 

구현하기 위해서는 Comparable interface를 implements 한 이후에, compareTo() 메소드를 오버라이드하여 구현합니다.

 

return 값이 양수인 경우에 두 객체의 자리가 바뀌게 됩니다.

 

Arrays.sort() 와 Collections.sort() 의 차이

Arrays.sort()는 배열 정렬을 할 경우 사용합니다. ex) byte[], char[] ,double[] ,int[] ,Object[] 등

 

Collections.sort()에서는 List Collection을 정렬할 때 사용합니다. ex) ArrayList, LinkedList, Vector 등

* 내부적으로 Arrays.sort()를 사용합니다.

 

// x좌표가 증가하는 순, x좌표가 같으면 y가 감소하는 순으로 정렬할 때
public class Point implements Comparable<Point> {

	int x,y;
    
    public Point(int x,int y){
    	this.x = x;
        this.y = y;
    }
	
    
    // compareTo 는 양수일 때, 객체 값을 변경하게 됩니다.
    @Override
    public int compareTo(Point p){
    	// this.x 가 parameter p 보다 크면, 오름차순이 되지 않으므로 바꿔줘야 합니다. 따라서 Return 1
    	if(this.x>p.x){
        		return 1;
        }else if(this.x==p.x){
        	return p.y-this.y;
        }else{
        	return -1;
        }    
    }
}


List<Point> li = new ArrayList<>();
li.add(new Point(x,y));

// List기 때문에 Collections.sort 사용
Collections.sort(li);

 

Comparator

정렬 가능한 클래스 ( Comparable 인터페이스를 구현한 클래스 ) 들의 기본 정렬 기준과 다르게 정렬하고 싶을 때 사용하는

인터페이스입니다. ( ex. PriorityQueue 를 선언할 때, 이를 변경하고 싶으면 Comparator를 사용합니다. )

 

java.util.Comparator

주로, 익명 클래스로 사용합니다.

기본적인 정렬 방법인 오름차순 정렬을 내림차순으로 정렬할 때 많이 사용합니다.

 

 

// 기본은 Min Heap ( 작은 값이 우선순위가 높은 ) 이지만, 이를 Max Heap 으로 변경하고 할 때
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
	public int compare(Integer o1,Integer o2){
    	return o2-o1;
        // 혹은
        // return o2.compareTo(o1);
    }
});

 

'JAVA' 카테고리의 다른 글

JAVA Stream 사용법  (0) 2021.05.23
JAVA Exception  (0) 2021.05.16
정규표현식 JAVA 공식 문서로 혼내주자!😡  (0) 2021.04.29
String vs StringBuffer vs StringBuilder ( JAVA )  (0) 2021.04.27