알고리즘 문제를 풀던 중 int 타입의 두 배열을 하나는 오름차순 나머지 하나는 내림차순 정렬을 진행해야 했다.
오름차순은 Arrays.sort()을
내림차순은 Collections.reverseOrder()를 활용하여 정렬을 진행하려 했는데
오름차순 진행하는 A는 잘 되지만 B에서 컴파일에러가 잡혔다.
뭔가 하고 보니 다음과같이 T타입의 객체를 받는단다.
근데 왜 A는 잘 됐을까??
왜 그런가 하고 해당 메소드의 오버로딩된 여로 메소드들에 대한 매개변수를 찾아봤다. 매개변수에 커서를 두고 Cmd+p (윈도우 ctrl+p) 누르면 확인 가능하니 참고하자
Arrays.sort 에서는 원시타입의 배열과 Object를 상속받는 모든 객체들을 받을 수 있는데 Comparator를 받을 수 있도록 오버로딩된 메소드는 Object를 받고 있는데 나는 int타입을 넣었다…!
💡 따라서 Object로 형변환이 가능한 Integer 객체로 바꿔주면 해결!
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] A = new int[n];
Integer[] B = new Integer[n];
for (int i = 0; i < n; i++) {
A[i] = sc.nextInt();
}
for (int i = 0; i < n; i++) {
B[i] = sc.nextInt();
}
Arrays.sort(A);
Arrays.sort(B, Collections.reverseOrder());
System.out.println(Arrays.toString(A));
System.out.println(Arrays.toString(B));
}
}
혹시 매개변수로 int[]을 받는 상황처럼 형변환을 해야 한다면 스트림을 통해 간단하게 변환이 가능하니 참고하도록 하자.
int[] ints = {5, 2, 9, 1, 7};
Integer[] integerArray = Arrays.stream(ints).boxed().toArray(Integer[]::new);
Arrays.sort(integerArray, Collections.reverseOrder());
int[] ints = {5, 2, 9, 1, 7};
Arrays.stream(ints).boxed().sorted(Collections.reverseOrder());