본문 바로가기

java(자바)

[java(자바)] 2차원 배열 정렬하기 Comparator, 람다식 _디버깅의 눈물

2차원 배열 정렬하기 Comparator, 람다식

 

 

-2차원 배열을 정렬할 때 1)Comparator를 이용한 방법2)람다식을 이용한 방법 두 가지를 활용할 수 있다.

 

 

 

1)Comparator를 이용한 이차원 배열의 정렬

 

int[][] arr = {{0,2}, {3,5}, {1,9}, {1,8}};

 

 

-위와 같이 구성된 int 2차원 배열이 존재한다 할 때, 출력 순서는 (0 2), (3 5), (1 9), (1 8)이다.

 

1)배열의 첫번째 자리를 오름차순으로 정렬한 후,

2)첫번째 자리가 동일하다면 두번째 자리를 오름차순으로 정렬할 때 아래와 같이 표현할 수 있다. 

 

 

Arrays.sort(arr, new Comparator<int[]>() {

    @Override
    public int compare(int[] o1, int[] o2) {

        // 2차원 배열의 첫번째 자리가 같다면,
        if(o1[0]==o2[0]){
            // 2차원 배열의 두번째 자리를 비교 후 return
            // o1[1] - o2[1]이 양수일 경우 그대로, 음수일 경우 순서를 변경
            return o1[1] - o2[1];
        }
        // 2차원 배열의 첫번째 자리가 다르다면,
        else{
            // 2차원 배열 값의 첫번째 자리 비교 후 return
            // o1[0] - o2[0]이 양수일 경우 그대로, 음수일 경우 순서를 변경
            return o1[0] - o2[0];
        }
    }
});



    
// 원본 출력 순서
0 2 
3 5 
1 9 
1 8
        
// 정렬 후 출력 순서
0 2 
1 8 
1 9 
3 5

 

 

-위 식에서 처음 비교할 때 o1의 값으로 (3 5)가, o2의 값으로는 (0 2)가 온다.

자세히 보자면,

1)o1[0]은 3, o1[1]은 5,

2)o2[0]은 0, o2[1]은 2이고, 이로부터 비교가 시작된다.

 

-전체 비교 순서는

(3 5), (0 2) -> (1 9), (3 5) -> (1 9), (0 2) -> (1 8), (1,9) -> (1,8), (0,2) 로 진행된다.

 

 

 

 

 

2)람다식을 이용한 이차원 배열의 정렬

 

 

arr = new int[][] {{0,2}, {3,5}, {1,9}, {1,8}};

Arrays.sort(arr, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]);



        
// 원본 출력 순서
0 2 
3 5 
1 9 
1 8
        
// 정렬 후 출력 순서
0 2 
1 8 
1 9 
3 5

 

 

-람다식 표현과 삼항연산자를 통해 간단하게 구현할 수 있다.

 

 

 

 

 

 

 

p.s)2차원 배열 문자열 정렬하기

 

 

String [][] arr1 = {{"a","b"}, {"c","v"}, {"c","a"}, {"b","z"}};

 

 

-위와 같은 2차원 문자열 배열이 존재한다고 할 때, compareTo 내장함수를 통해 문자열 순서를 정렬할 수 있다.

 

 

Arrays.sort(arr1, new Comparator<String[]>() {

    @Override
    public int compare(String[] o1, String[] o2) {

        if(o1[0].compareTo(o2[0])>0){
            return 1;
        }
        else if(o1[0].compareTo(o2[0])<0){
            return -1;
        }
        else{
            if(o1[1].compareTo(o2[1])>0){
                return 1;
            }
            else if(o1[1].compareTo(o2[1])<0){
                return -1;
            }
            else{
                return 0;
            }
        }
    }

});



// 원본 출력 순서
a b
c v
c a
b z


// 정렬 후 출력 순서
a b
b z
c a
c v

 

 

-문자열 비교 시 compareTo 함수같은 위치의 문자만 비교한다는 특성이 있다.

 

1)기준 문자열과 비교 문자열이 첫번째 자리부터 어느 한쪽에 모두 포함된다면, 문자열 간의 길이를 return한다.

-예를 들어 "abc"와 "abcdef"가 있다면, 첫번째 자리부터 "a", "b", "c"는 동일하기 때문에 "def"만큼의 길이인 3을 return한다.

 

2)기준 문자열과 비교 문자열이 첫번째 자리부터 어느 한쪽에 포함되지 않는다면, 아스키 코드 값을 기준으로 비교한다.

-예를 들어, "abcd"와 "d"가 있다면, 첫번째 자리부터 "a"와 "d"는 다르기 때문에, 아스키 코드 값을 비교한다. 이때 "a"의 아스키 값은 97이고 "d"의 아스키 값은 100이기 때문에, 3을 return 한다.