1차원 배열은 간단하게 Arrays.sort를 사용하면 가능하지만 2차원 배열은 compare 함수를 override를 해야지만 가능합니다.
다음과 같은 수가 input으로 주어지고, 첫번째 원소를 기준으로 정렬하되, 첫번 째 원소의 값이 같을 시 두번쨰 원소를 오름차순으로 정렬하는 코드를 예로 들어보겠습니다.
input
3 4
1 1
1 -1
2 2
3 3
3 -5
import java.io.*;
import java.util.*;
public class Algorithm {
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[][] arr = new int[6][2];
for(int i =0 ; i < 6; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
// (배열, override 함수);
Arrays.sort(arr, new Comparator<int[]>() { // new Comparator 함수 Override
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0]){ // 첫번째 원소의 값이 같을 때 두번쨰 원소의 값을 기준으로 정렬
return o1[1] - o2[1];
}else{ // 같지 않을 시 첫번째 원소를 기준으로 정렬
return o1[0] - o2[0];
}
}
});
for(int i = 0; i < 6; i++){ // 출력문
System.out.println(arr[i][0] + ", "+arr[i][1]);
}
}
}
다음과 같이 sort함수 안에 배열과, override할 함수를 선언을 하면 compare함수를 자동완성 시켜줍니다. 그 후 o1과 o2의 값을 비교하여 오름차순을할지, 내림차순을 할지 결정합니다.
오름차순 : o1 - o2;
내림차순 : o2 - o1;
여기서 o1과 o2는 다음의 사진을 보면 이해가 금방됩니다.
o1, o2는 행으로 생각하고 행에서의 첫번쨰 원소와 두번째 원소를 비교하여 정렬을 합니다.
java에서 lambda식을 이용하여 한줄로도 2차원 배열 정렬이 가능합니다.
Arrays.sort(arr, (o1,o2) -> (o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]));
// Arryas.sort(2차원 배열, (o1,o2) -> ( 조건문 ? true 일때 정렬순서 : false일때 정렬순서));
Override를 통해 하는 정렬과 방식은 같은데 삼항연산자를 이용하여 간단하게 위의 코드와 같이 람다식으로 정렬이 가능합니다.