배열과 컬렉션 정렬 실습
실제 사례를 통해 상품 목록, 순위표, 행사 일정을 정렬합니다.
배열과 컬렉션 정렬 실습은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
정렬 실습
이 레슨에서는 상품 카탈로그, 순위표, Event 일정 관리, 검색 결과 순위 지정과 같은 현실적인 상황에 정렬 기법을 적용합니다.
원시 배열에 사용하는 Arrays.sort
원시 배열에 사용하는 Arrays.sort()는 이중 피벗 퀵 정렬을 사용하며 평균 시간 복잡도는 O(n log n)으로 매우 빠릅니다.
int[] scores = {45, 90, 78, 62, 88, 33};
Arrays.sort(scores);
System.out.println(Arrays.toString(scores)); // [33, 45, 62, 78, 88, 90]
// Sort a range only
int[] data = {9, 3, 7, 1, 5};
Arrays.sort(data, 1, 4); // sort indices 1-3 only
System.out.println(Arrays.toString(data)); // [9, 1, 3, 7, 5]객체 배열에 사용하는 Arrays.sort
객체 배열에서 Arrays.sort()는 TimSort(안정적)를 사용합니다. 사용자 지정 순서를 위해 비교자를 제공할 수 있습니다.
String[] names = {"Charlie", "Alice", "Bob", "Diana"};
Arrays.sort(names);
System.out.println(Arrays.toString(names)); // [Alice, Bob, Charlie, Diana]
// Custom order: by length, then alphabetically
Arrays.sort(names, Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()));
System.out.println(Arrays.toString(names)); // [Bob, Alice, Diana, Charlie]Collections.sort와 List.sort
두 방법 모두 목록을 제자리에서 정렬합니다. List.sort()가 현재 권장되는 방식입니다.
List<Integer> nums = new ArrayList<>(List.of(5, 2, 8, 1, 9, 3));
// Old way
Collections.sort(nums);
System.out.println(nums); // [1, 2, 3, 5, 8, 9]
// Modern way (same result)
nums.sort(Comparator.naturalOrder());
nums.sort(null); // null means natural order
// Descending
nums.sort(Comparator.reverseOrder());
System.out.println(nums); // [9, 8, 5, 3, 2, 1]함수형 스타일에 사용하는 Stream.sorted()
파이프라인을 구성할 때 stream().sorted()를 사용합니다. 원본을 수정하지 않고 새로 정렬된 스트림을 생성합니다.
List<String> cities = List.of("Tokyo", "London", "New York", "Paris", "Sydney");
// Sorted stream — source list unchanged
List<String> sorted = cities.stream()
.sorted(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()))
.collect(Collectors.toList());
System.out.println(sorted);
// [Paris, Tokyo, London, Sydney, New York]값을 기준으로 맵 정렬하기
면접에서 자주 나오는 문제입니다. 스트림과 비교자를 사용하여 맵의 값을 기준으로 정렬합니다.
import java.util.*;
import java.util.stream.*;
Map<String, Integer> scores = Map.of(
"Alice", 95, "Bob", 87, "Charlie", 92, "Diana", 87
);
Map<String, Integer> sorted = scores.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue(Comparator.reverseOrder())
.thenComparing(Map.Entry.comparingByKey()))
.collect(Collectors.toLinkedHashMap(
Map.Entry::getKey, Map.Entry::getValue,
(v1, v2) -> v1, LinkedHashMap::new));
sorted.forEach((k, v) -> System.out.println(k + ": " + v));
// Alice: 95 / Charlie: 92 / Bob: 87 / Diana: 87로캘에 맞춘 Collator 정렬
언어를 고려한 문자열 정렬에는 String.compareTo 대신 java.text.Collator를 사용합니다. Collator는 악센트, 대소문자, 로캘별 순서를 처리합니다.
import java.text.*;
import java.util.*;
List<String> names = new ArrayList<>(List.of("éclair", "apple", "Über", "banana"));
Collator collator = Collator.getInstance(Locale.GERMAN);
names.sort(collator);
System.out.println(names); // locale-aware sort여러 기준으로 객체 정렬하기
전자 상거래 상품 정렬: 재고가 있는 상품을 먼저 배치하고, salePrice, 평점, 이름 순으로 정렬합니다.
record Product(String name, double price, double salePrice, double rating, boolean inStock) {}
Comparator<Product> bestFirst = Comparator
.comparing(Product::inStock).reversed() // in-stock first
.thenComparingDouble(Product::salePrice) // cheapest sale price
.thenComparingDouble(Product::rating).reversed() // highest rated
.thenComparing(Product::name); // alphabetical tiebreak날짜와 시간으로 Event 정렬하기
Comparable을 구현하는 java.time 형식을 사용하여 Event 일정 목록을 시간순으로 정렬합니다.
import java.time.*;
import java.util.*;
record Event(String title, LocalDate date, LocalTime time) {}
List<Event> schedule = new ArrayList<>(List.of(
new Event("Workshop", LocalDate.of(2024,7,15), LocalTime.of(9, 0)),
new Event("Keynote", LocalDate.of(2024,7,14), LocalTime.of(10, 30)),
new Event("Lunch Talk",LocalDate.of(2024,7,15), LocalTime.of(12, 0)),
new Event("Hackathon", LocalDate.of(2024,7,14), LocalTime.of(9, 0))
));
schedule.sort(Comparator.comparing(Event::date).thenComparing(Event::time));
schedule.forEach(e -> System.out.println(e.date() + " " + e.time() + " " + e.title()));정렬을 사용한 상위 N개 요소 찾기
상위 N개 요소를 효율적으로 찾는 방법은 내림차순으로 정렬한 후 처음 N개를 가져오거나, 대규모 데이터셋에 PriorityQueue를 사용하는 것입니다.
List<Integer> values = List.of(42, 17, 88, 5, 73, 56, 91, 33);
// Simple approach: sort descending, take first 3
List<Integer> top3 = values.stream()
.sorted(Comparator.reverseOrder())
.limit(3)
.collect(Collectors.toList());
System.out.println(top3); // [91, 88, 73]
// For very large datasets: PriorityQueue min-heap approach is O(n log k)
import java.util.PriorityQueue;
PriorityQueue<Integer> heap = new PriorityQueue<>(3);
for (int v : values) {
heap.offer(v);
if (heap.size() > 3) heap.poll();
}
System.out.println(new TreeSet<>(heap).descendingSet()); // [73, 88, 91]정렬을 사용한 중복 제거
정렬한 후에는 중복 항목이 서로 인접하므로 O(n) 시간에 탐지할 수 있습니다.
int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5};
Arrays.sort(arr); // sort first
// Remove duplicates in O(n) after sorting
int[] unique = Arrays.stream(arr).distinct().toArray();
System.out.println(Arrays.toString(unique)); // [1, 2, 3, 4, 5, 6, 9]성능: 정렬 방법 선택하기
적절한 정렬 방식을 선택하는 방법:
- 원시 배열: Arrays.sort() — 가장 빠른 제자리 퀵 정렬
- Comparable을 구현한 객체 배열/목록: Collections.sort() 또는 List.sort(null)
- 여러 정렬 순서: thenComparing을 사용한 비교자 연결
- 대규모 스트림에서 상위 N개: PriorityQueue 또는 Stream.sorted().limit(N)
빠른 확인
Java는 Arrays.sort()에서 객체 배열에 어떤 정렬 알고리즘을 사용합니까?
복습: 실전에서 배열과 컬렉션 정렬하기
핵심 내용:
- 원시 타입에 사용하는 Arrays.sort()는 이중 피벗 퀵 정렬을 사용하고, 객체에는 TimSort(안정적)를 사용합니다
- List.sort(비교자)와 Collections.sort()는 모두 안정적인 TimSort입니다
- stream().sorted()는 원본을 수정하지 않고 새로 정렬된 스트림을 생성합니다
- 값을 기준으로 맵 정렬: entrySet().stream().sorted(Map.Entry.comparingByValue())
- 로캘을 고려한 문자열 정렬에는 Collator를 사용합니다
- 대규모 데이터에서 상위 N개를 찾을 때는 전체 정렬보다 용량이 k인 PriorityQueue가 효율적입니다
자주 묻는 질문
“배열과 컬렉션 정렬 실습” 강의는 무료인가요?
네 — “배열과 컬렉션 정렬 실습” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“배열과 컬렉션 정렬 실습”에서 뭘 배우나요?
실제 사례를 통해 상품 목록, 순위표, 행사 일정을 정렬합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“배열과 컬렉션 정렬 실습” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.