2차원 배열을 사용하다보면 특정 index를 기준으로 정렬하고 싶을때가 있다.
물론 우리가 자료구조를 통해서 정렬을 할수도 있지만 정렬을 하는게 주된 문제가 아닐때는
자바에서 주어지는 정렬 클래스를 사용하는게 더 빠른 방법이다.
그래서 지난번에 배운 Comperable 혹은 Comperator 클래스를 사용하면 된다.
https://wpioneer.tistory.com/101
2차원 배열 오름차순
1차원 배열을 오름차순으로 정렬을 하고 싶을때는 아래와 같이 하면 됐었다.
Arrays.sort(배열)
하지만 2차원 배열을 오름차순으로 정렬 하고 싶을때는
아래와 같이 해줘야 한다.
int[][] costs = {{0,1,1},{0,2,2},{1,2,5},{1,3,1},{2,3,8}};
Arrays.sort(costs, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// TODO Auto-generated method stub
return o1[2]-o2[2];
}
});
위소스는 costs라는 배열의 costs[2] index를 오름차순으로 정렬한다는 얘기이다.
위 소스를 람다식으로 표현 하면 아래와 같다.
Arrays.sort(costs,(o1,o2)->(o1[2]-o2[2]));
2차원 배열 내림차순
1차원 배열을 내림차순으로 정렬하고 싶을땐 int[] 배열을 Integer[] 배열로 변형 바꿔준뒤
Integer[]을 내림차순으로 정렬을 했었다.
int[] temp = {0,2,4,5,1,7,9,8};
Integer[] temp2 = Arrays.stream(temp).boxed().toArray(Integer[] :: new);
Arrays.sort(temp2,Collections.reverseOrder());
하지만 2차원 배열에서는 위의 오름차순 정렬 소스에서 o1와 o2의 위치만 바꿔주면 된다.
int[][] costs = {{0,1,1},{0,2,2},{1,2,5},{1,3,1},{2,3,8}};
Arrays.sort(costs, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// TODO Auto-generated method stub
return o2[2]-o1[2];
}
});
위소스도 람다식으로 표현하면 아래와 같다.
Arrays.sort(costs,(o1,o2)->(o2[2]-o1[2]));
그리고 우리가 2차원 배열을 정렬하고자 할때 특정 index의 값이 같다면 그 안에 있는 값으로 정렬해야할때가 있다.
예를 들어 [3,4] [3,2]를 index 0을 기준으로 정렬하고 해야할때 두 배열 모두 3으로 같기 때문에 index 1의 자리를
기준으로 정렬을 해야한다.
해당 방법은 아래와 같다.
오름차순
int[][] temp = {{3,2},{3,1},{4,1}};
Arrays.sort(temp,(o1,o2)->{
if(o1[0] == o2[0]) {
return Integer.compare(o1[1], o2[1]);
}else {
return Integer.compare(o1[0], o2[0]);
}
});
결과
[[3, 1], [3, 2], [4, 1]]
내림차순
int[][] temp = {{3,2},{3,1},{4,1}};
Arrays.sort(temp,(o1,o2)->{
if(o2[0] == o1[0]) {
return Integer.compare(o2[1], o1[1]);
}else {
return Integer.compare(o2[0], o1[0]);
}
});
결과
[[4, 1], [3, 2], [3, 1]]
'코딩일기 > Java' 카테고리의 다른 글
[Java] LinkedList 란? (0) | 2021.06.18 |
---|---|
[Java] 2차원 배열 출력 방법 (0) | 2021.06.14 |
[Java] Stack 클래스 사용방법 (0) | 2021.06.11 |
[Java] Comperator 와 Comperable (0) | 2021.06.03 |
[Java] 배열 복사 하는 방법 ( clone(), copyOf(), copyOfRange() ) (0) | 2021.06.02 |