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 한다.
'java(자바)' 카테고리의 다른 글
[java(자바)] 상속 관계, 포함 관계(is-a, has-a) _디버깅의 눈물 (0) | 2023.02.24 |
---|---|
[java(자바)] non-static 멤버와 static 멤버의 차이점 _디버깅의 눈물 (0) | 2023.02.23 |
[java(자바)] treeSet 오름차순 정렬하기 Collections.reverseOrder() _디버깅의 눈물 (1) | 2022.10.05 |
[java(자바)] int 배열 내림차순 정렬하기(reverseOrder) _디버깅의 눈물 (0) | 2022.10.05 |
[java(자바)] int와 Integer의 차이 _디버깅의 눈물 (0) | 2022.10.05 |