목차
- 왜 원시 배열은 내림차순 정렬을 지원하지 않을까?
- 원시 배열을 내림차순 정렬하는 방법
- 정리
- 예제 코드
자바에서는 Arrays.sort() 를 사용해 원시(Primitive) 배열을 쉽게 정렬할 수 있습니다. 하지만 원시 타입 배열에 대해 내림차순 정렬은 지원되지 않습니다.
이 글에서는 원시 배열에 내림차순 정렬이 지원되지 않는 이유와, 이를 해결할 수 있는 대안에 대해 알아보겠습니다.
1️⃣ 왜 원시 배열은 내림차순 정렬을 지원하지 않을까?
원시 배열은 기본적으로 객체가 아니기 때문에 Comparator를 사용할 수 없습니다.
Arrays.sort()는 원시 타입 배열에 대해 Comparator를 지원하지 않으므로, 정렬 순서를 커스터마이즈할 수 없습니다. 반면, 객체 타입 배열(Integer[], Double[] 등)은 Comparator를 사용하여 내림차순 정렬을 할 수 있습니다.
2️⃣ 원시 배열을 내림차순 정렬하는 방법
1. 오름차순 정렬 후 배열 뒤집기
가장 단순한 방법은 Arrays.sort()로 원시 배열을 오름차순 정렬 후 배열된 정렬을 역순으로 뒤집는 방법입니다.
package pl.java.D250215;
import java.util.Arrays;
public class SortPrimitiveArrayReverse1 {
public static void main(String[] args) {
int[] primitiveArray = {9, 2, 1, 5, 7};
Arrays.sort(primitiveArray);
for (int i = 0; i < primitiveArray.length / 2; ++i) {
int temp = primitiveArray[i];
primitiveArray[i] = primitiveArray[primitiveArray.length - 1 - i];
primitiveArray[primitiveArray.length - 1 - i] = temp;
}
System.out.println(Arrays.toString(primitiveArray));
}
}
/*
[9, 7, 5, 2, 1]
*/
2. 객체 배열로 변환 후 정렬
원시 타입 배열을 객체 타입 배열로 변환한 후 Arrays.sort()와 Collections.reverseOrder()를 사용하여 내림차순 정렬을 할 수 있습니다.
package pl.java.D250215;
import java.util.Arrays;
import java.util.Comparator;
public class SortPrimitiveArrayReverse2 {
public static void main(String[] args) {
int[] primitiveArray = {9, 2, 1, 5, 7};
Integer[] objectArray = Arrays.stream(primitiveArray).boxed().toArray(Integer[]::new);
Arrays.sort(objectArray, Comparator.reverseOrder());
System.out.println(Arrays.toString(objectArray));
}
}
원시 배열에 대한 정렬이 아닌, 객체 배열에 대한 정렬이므로 람다식 표현을 사용한 내림차순 정렬도 가능합니다.
Arrays.sort(objectArray, (a, b) -> b - a);
만약 내림차순 정렬된 원시 배열이 필요하다면 다음과 같이 해결할 수 있습니다.
int[] descSortedPrimitiveArray = Arrays.stream(primitiveArray).boxed().
sorted(Comparator.reverseOrder()).mapToInt(Integer::intValue).toArray();
🔥 정리
원시 배열은 객체 타입이 아니기 때문에(목적에 맞는 성능)을 위해 내림차순 정렬을 기본적으로 지원하지 않습니다.
하지만 기본 정렬(오름차순 정렬) 후 배열을 뒤집거나 스트림을 사용해 객체 배열로 변환 후 내림차순 정렬을 구현할 수 있습니다.
예제 코드
tech-blog-code/pl/java/D250215 at main · rogi-rogi/tech-blog-code
'Programming Language > Java' 카테고리의 다른 글
[Java] Java의 다양한 정렬 방법 1 : Primitive / Object (0) | 2025.02.17 |
---|---|
Java에서 Primitive Array 정렬에 Dual-Pivot Quicksort를 선택한 이유 (0) | 2025.02.14 |
[Java] Java switch의 문자열 비교, 내부 원리와 성능 분석 (0) | 2025.02.13 |
[Java] List.of()로 생성된 불변 리스트와 컬렉션 초기화 (0) | 2025.02.13 |
[Java] 람다 표현식의 반환 타입 추론 (0) | 2025.02.13 |