본문 바로가기

Language/JAVA

[JAVA] 자바 2차원 배열 정렬 Comparator (compare(), compareTo() 재정의)

설명

Array와 ArrayList를 정렬하는 법

https://rookie-programmer.tistory.com/52

 

[JAVA] Array sort, ArrayList sort (배열 정렬, ArrayList sort 정렬)

ArrayList 정렬 1. Collections.sort() import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; public class example { public static void main(String args[]) { ArrayList list = new ArrayList(Arrays.asList(4, 7, 5, 2, 9, 6)); //

rookie-programmer.tistory.com

 

 

 

오늘은 2차원 배열을 정렬하는 법에 대해서 설명하겠다.

출처 : https://velog.io/@youjin0411/2차원-배열

2차원 배열은 1차원 배열이 여러 개 있는 형태로, 첫번째 []에는 행의 정보가, 두번째 []에는 열의 정보가 들어간다.

위 그림과 같이 3행 5열의 2차원 배열이 있을 경우 특정 배열 칸에 값을 넣거나 값을 가져올 때 a[행][열]로 접근하면 된다.

 

 

 

1차원 배열 정렬은 보통 Array.sort()로 간단하게 할 수 있지만 2차원 배열을 정렬하는 방법은 다소 복잡하다.

Comparator 익명클래스 구현하는 방법으로 compare() 메서드를 오버라이드하여 원하는 정렬 기준으로 정렬한다.

오름차순, 내림차순 외에 원하는 조건으로도 구현이 가능하다.

 

 

 

compare() 재정의

1. 특정 열 하나를 기준으로 정렬

Arrays.sort(arr, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0]-o2[0]; // 0번째 열 기준 오름차순
        //return o2[0]-o1[0]; // 0번째 열 기준 내림차순
        //return o1[1]-o2[1]; // 1번째 열 기준 오름차순
        //return o2[1]-o1[1]; // 1번째 열 기준 내림차순
    }
});

결과

0번째 열(숫자들을) 기준으로 오름차순으로 정렬된 결과를 볼 수 있다.

return 문 다음 문장을 상황에 맞게 바꿔주면 1번째 열 기준, 내림차순 등으로 2차원 배열을 쉽게 정렬할 수 있다.

 

 

 

 

2. 특정 열 두 개를 기준으로 정렬(0번째 열 정렬 후 1번째 열 정렬)

0번째 열 기준으로 정렬 후 1번째 열 기준으로 정렬한다.

0번째 열 값의 의해서 정렬하고, 그 값이 같을 경우 1번째 열 값에 의해 정렬된다.

 

 

Arrays.sort(arr, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        if (o1[0] == o2[0]) {
            return o1[1] - o2[1]; // 오름차순 o1[1] - o2[1] 내림차순 o2[1] - o1[1]
        } else {
            return o1[0] - o2[0];
        }
    }
});

 if (o1[0] == o2[0]) : 0번째 열의 값이 같다면

return o1[1] - o2[1] : 다음 열인 1번째 열의 값으로 오름차순으로 정렬한다

else : 0번째 열의 값이 다르다면

return o1[0] - o2[0] : 0번째 열의 값을 기준으로 오름차순으로 정렬한다

 

 

결과

1. 특정 열 하나를 기준으로 정렬했을 때는 1 3 다음에 1 2가 나왔지만

이번 경우에는 0번째 열의 값이 같다면 1번째 열의 값으로 한 번 더 정렬되기 때문에 1 2 다음에 1 3이 정렬된 것을 확인할 수 있다.

 

 

 

compareTo() 재정의

https://rookie-programmer.tistory.com/85

 

[Inflearn] 자바 알고리즘 문제풀이 #06-07 7. 좌표 정렬

문제 설명 N개의 평면상의 좌표(x, y)가 주어지면 모든 좌표를 오름차순으로 정렬하는 프로그램을 작성하세요. 정렬기준은 먼저 x값의 의해서 정렬하고, x값이 같을 경우 y값에 의해 정렬합니다.

rookie-programmer.tistory.com

7. 좌표 정렬 - 선생님 풀이 부분 + 알게된 점 2번 부분