Yeji's Tech Notes
반응형

안녕하세요! 알고리즘을 풀다보면 좌표를 정렬하거나 객체를 정렬해야되는 경우가 있습니다.

예) (x,y)좌표 값에서 x 좌표를 기준으로 정렬하기, 키 몸무게가 입력된 학생들 중 키 순으로 정렬하기

이런 경우 키값, x좌표 기준으로 정렬하기 위해서 반복문을 사용해 정렬하는 경우도 있지만

이번 글에서는 Comparable을 이용해 정렬하는 방법을 정리해보았습니다!

 

클래스 생성

해당 예시는 좌표정렬을 예시로 들었습니다. 우선 x,y좌표를 넣을 Point 객체를 생성해줍니다.

class Point {
	
    int x;
    int y;
    
    Point(int x, int y){
    	this.x = x;
        this.y = y;
   }
}

 

테스트할 데이터도 미리 생성해줍니다. 예시로 List안에 5개 정도의 좌표값을 넣어주었습니다.

class Main{

    public static void main(String[] args){
 		
        List<Point> pointList = new ArrayList<>();
        pointList.add(new Point(2,7));
    	pointList.add(new Point(1,3));
        pointList.add(new Point(1,2));
    	pointList.add(new Point(2,5));
        pointList.add(new Point(2,7));
        pointList.add(new Point(3,6));
    }

}

위의 List에 들어간 Point들을 x좌표 기준 오름차순으로 정렬하면 어떤 값이 나와야될까요?

우선 x가 1인 좌표들이 우선 나오고 마지막은 3인 좌표가 나올 것으로 기대예상됩니다.

자바 배열 정렬

자바에서는 비교 가능한 인터페이스를 구현하는 한 원하는 유형의 배열을 정렬할 수 있습니다.

public void sortArray(){
	
    int[] moesPints = new int[] {9, 8, 7, 6, 1};

	Arrays.sort(moesPints);

	Arrays.stream(moesPints).forEach(System.out::print);

}

Arrays.sort();를 이용했을 경우, 아래와 같이 배열에 들어가있는 값을 정렬할 수 있습니다.

1 6 7 8 9

 

하지만 특정 타입의 객체 (Custom Object)는 기본형 데이터와 달리 정렬의 기준이 없으면 정렬을 할 수가 없으며, 따라서 정렬 기준을 정의해야합니다.

 

Comparable 인터페이스 구현

class Point implements Comparable<Point>{
	
    int x;
    int y;
    
    Point(int x, int y){
    	this.x = x;
        this.y = y;
   }
   
   @Override
   public int compareTo ( Point point ) {
       return this.x - point.x;
   }
}

객체의 정렬 기준을 정의하는 방법으로 Comparable인터페이스를 상속받아 구현하는 방법이 있습니다.

Comparable인터페이스의 compareTo()메서드를 통해 인자로 넘어온 같은 타입의 다른 객체를 비교 할 수 있습니다.

 

Comparable의 compareTo는 자기자신과 매개변수를 비교합니다. compareTo는 정수를 반환하며, 자기 자신을 기준으로 상대방과의 차이 값을 비교하여 반환합니다.

return 값 결과
>=1 this.x > point.x
==0 this.x == point.x
<= -1 this.x < point.x

위의 표는 compareTo()의 return 된 값을 통한 대소비교 결정입니다.

 

예를들어,

ex) this.x(1) , point.x(2) 

: this.x - point.x = -1 

자기자신과 상대방과의 차이 값을 비교 했을 때 음수가 나오면 자기자신은 작은 값이고, 양수이면 큰 값이 됩니다.

 

내림차순 구현

class Point implements Comparable<Point>{
	
    int x;
    int y;
    
    Point(int x, int y){
    	this.x = x;
        this.y = y;
   }
   
   @Override
   public int compareTo ( Point point ) {
       return point.x - this.x;
   }
}

내림차순 구현은 개개인마다 방법은 다르겠지만, 위의 예제에서는 point.x와 this.x의 위치를 바꿔줬습니다.

이 경우, 위에서 구현했던 방식과 반대로 작용되어, 오름차순으로 결과 값이 나올 수 있습니다.

 

[Comparable의 특징]

1. 자기 자신과 매개변수를 비교한다.

2. compareTo 메소드를 반드시 구현해야한다.

반응형
profile

Yeji's Tech Notes

@Jop

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!