TreeMap이랑 Stream은 어떨 때 쓰면 좋을까
비슷한 상황에서 각각 예시를 보자
TreeMap<String, Integer> sortedMap = new TreeMap<>(totalMap);
int[] result = new int[sortedMap.size()];
int idx = 0;
for (String car : sortedMap.keySet()) {
int totalTime = sortedMap.get(car);
int baseTime = fees[0], baseFee = fees[1], unitTime = fees[2], unitFee = fees[3];
if (totalTime <= baseTime) {
result[idx++] = baseFee;
} else {
int extraTime = totalTime - baseTime;
int extraFee = (int) Math.ceil((double) extraTime / unitTime) * unitFee;
result[idx++] = baseFee + extraFee;
}
}
return totalMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.mapToInt(e -> {
int totalTime = e.getValue();
int baseTime = fees[0], baseFee = fees[1], unitTime = fees[2], unitFee = fees[3];
if (totalTime <= baseTime) return baseFee;
int extraTime = totalTime - baseTime;
return baseFee + (int) Math.ceil((double) extraTime / unitTime) * unitFee;
})
.toArray();
TreeMap이 더 좋은 상황
- 데이터를 여러 번 정렬 순서대로 다뤄야 할 때
- 예: 계속 put/get 하면서, 항상 정렬된 상태 유지가 필요한 경우.
- TreeMap은 삽입될 때마다 자동으로 정렬되므로 별도 정렬 불필요.
- 중간에 가장 작은 값, 가장 큰 값 자주 꺼낼 때
- firstKey(), lastKey() 같은 메서드가 있음.
- 예:
- 주식 호가창 관리 (최저가/최고가 조회)
- 순번표 시스템 (가장 앞 번호, 가장 뒤 번호 관리)
- 데이터 추가/삭제가 계속 일어나면서 정렬 상태가 유지되어야 하는 경우
- 로그 타임라인 관리, 캐시 관리(시간 순서), 스케줄러 구현
Stream이 더 좋은 상황
- 한 번 정렬해서 결과만 필요할 때
- Map 자체를 정렬 상태로 계속 유지할 필요 없고,
결과만 배열이나 리스트로 뽑으면 끝나는 경우. - → 코딩테스트 대부분은 이 케이스 (주차 요금 계산도 사실 이쪽).
- Map 자체를 정렬 상태로 계속 유지할 필요 없고,
- 데이터 변환/가공까지 한 번에 하고 싶을 때
- stream().sorted().map(...).filter(...).toArray() →
정렬 + 가공 + 변환을 체이닝으로 처리 가능. - 예:
- 매출 리스트에서 고객ID 오름차순 정렬 후 매출 합계만 배열로
- 로그에서 시간 순 정렬 후 에러 코드만 추출
- stream().sorted().map(...).filter(...).toArray() →
- 코드 가독성과 간결성이 중요한 경우
- 실무 리뷰, Java 8+ 함수형 패러다임 권장 환경
- 유지보수성, 재사용성 고려
TreeMap = "데이터 구조 자체가 정렬된 상태로 유지돼야 한다"
Stream = "정렬은 한 번만 하고, 그 결과만 쓰면 된다"
기준TreeMap 방식Stream 방식
정렬 방법 | TreeMap 생성 시 자동 정렬 | .sorted(Map.Entry.comparingByKey()) |
추가 자료구조 | TreeMap 새로 생성 필요 | Stream 내부에서 정렬 후 바로 처리 |
코드 가독성 | 명시적이고 직관적 (for문) | 함수형 스타일, 짧고 깔끔 |
성능 | O(n log n) (Map 재생성) | O(n log n) (Stream 정렬) → 큰 차이 없음 |
추천 상황 | 코딩테스트, 초보자 가독성 | 실무, 함수형 코드 선호, Java 8+ 면접용 |
반응형
'Chapter01 > Java' 카테고리의 다른 글
[ Java ] TreeMap (1) | 2025.09.01 |
---|---|
[Java] Stack / Queue 사용예시 (2) | 2025.03.07 |
[ Java ] 이중해시맵 + 예시코드 (0) | 2024.06.17 |
[ java ] Stream_예시코드 (0) | 2024.05.28 |
[ java ] 객체지향 개발 SOLID 5대 원리 + 예시코드 (1) | 2024.03.13 |