Notice
Recent Posts
Recent Comments
Link
쯔이's Dev
TreeSet과 Collections.sort()의 차이 본문
반응형
기능 | TreeSet | Collections.sort() |
정렬 방식 | 자동 정렬 (추가 즉시 정렬됨) | 직접 sort() 호출해야 정렬됨 |
자료구조 | 이진 탐색 트리 (레드-블랙 트리) | 배열 기반 정렬 (퀵 정렬 등 사용) |
대상 | Set (중복 제거됨) | List (순서 유지됨) (ArrayList, LinkedList 등) |
정렬 기준 변경 | Comparator<T>로 변경 가능 | Comparator<T>를 넘기면 변경 가능 |
중복 허용 | ❌ 중복 불가 | ✅ 중복 허용 |
즉, TreeSet은 자동 정렬되지만, List는 Collections.sort()를 호출해야 정렬됨.
즉, Collections.sort()는 리스트 정렬용, TreeSet은 자동 정렬 기능을 가진 Set이다!
TreeSet과 Collections.sort() 둘 다 Comparator를 구현해야 하는가?
- 둘 다 Comparator<T>를 사용할 수 있지만, 반드시 구현해야 하는 것은 아니다!
- TreeSet은 기본적으로 Comparable<T>을 구현한 클래스가 필요하고, Comparator<T>를 제공하면 커스텀 정렬 가능
- Collections.sort()는 List<T>를 정렬하는데, T가 Comparable<T>을 구현했다면 기본 정렬 가능하지만, Comparator<T>를 넘기면 정렬 기준을 변경 가능
즉, 정렬 기준을 직접 변경하고 싶다면 Comparator<T>를 구현해야 하지만, 기본 정렬이 가능하면 따로 구현할 필요 없음!
TreeSet에서 기본 정렬 (Comparable 구현)
import java.util.TreeSet;
class Lottery implements Comparable<Lottery> {
String name;
public Lottery(String name) {
this.name = name;
}
@Override
public int compareTo(Lottery o) {
return this.name.compareTo(o.name); // ✅ 기본 정렬 기준: 이름 오름차순
}
@Override
public String toString() {
return name;
}
}
public class Main {
public static void main(String[] args) {
TreeSet<Lottery> treeSet = new TreeSet<>(); // ✅ Comparable 구현된 클래스 사용 가능
treeSet.add(new Lottery("Charlie"));
treeSet.add(new Lottery("Alice"));
treeSet.add(new Lottery("Bob"));
System.out.println(treeSet);
}
}
출력결과
[Alice, Bob, Charlie]
Comparable을 구현했기 때문에 Comparator 없이도 TreeSet에서 자동 정렬됨.
>> TreeSet에서 Comparator를 사용하는 경우
import java.util.Comparator;
import java.util.TreeSet;
class Lottery {
String name;
String phone;
public Lottery(String name, String phone) {
this.name = name;
this.phone = phone;
}
@Override
public String toString() {
return name + " (" + phone + ")";
}
}
public class Main {
public static void main(String[] args) {
// ✅ Comparator 사용하여 정렬 기준 변경 (이름 → 전화번호)
TreeSet<Lottery> treeSet = new TreeSet<>(new Comparator<Lottery>() {
@Override
public int compare(Lottery o1, Lottery o2) {
return o1.phone.compareTo(o2.phone); // ✅ 전화번호 기준 오름차순 정렬
}
});
treeSet.add(new Lottery("Charlie", "01012345678"));
treeSet.add(new Lottery("Alice", "01087654321"));
treeSet.add(new Lottery("Bob", "01099887766"));
System.out.println(treeSet);
}
}
출력결과
[Charlie (01012345678), Alice (01087654321), Bob (01099887766)]
Collections.sort()에서 Comparator<T>가 필요한 경우
Collections.sort()는 List<T>를 정렬하는데, T가 Comparable<T>을 구현하면 기본 정렬 가능
Comparator<T>를 넘기면 다른 정렬 기준을 적용 가능 (예: 이름 → 전화번호 정렬)
Comparable을 이용한 기본 정렬
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Lottery implements Comparable<Lottery> {
String name;
public Lottery(String name) {
this.name = name;
}
@Override
public int compareTo(Lottery o) {
return this.name.compareTo(o.name); // ✅ 기본 정렬 기준: 이름 오름차순
}
@Override
public String toString() {
return name;
}
}
public class Main {
public static void main(String[] args) {
List<Lottery> list = new ArrayList<>();
list.add(new Lottery("Charlie"));
list.add(new Lottery("Alice"));
list.add(new Lottery("Bob"));
Collections.sort(list); // ✅ 기본 정렬 (이름 오름차순)
System.out.println(list);
}
}
출력결과
[Alice, Bob, Charlie]
Comparable을 구현했기 때문에 Collections.sort()만 호출하면 자동 정렬됨.
Comparator<T>를 사용한 정렬 기준 변경
import java.util.*;
class Lottery {
String name;
String phone;
public Lottery(String name, String phone) {
this.name = name;
this.phone = phone;
}
@Override
public String toString() {
return name + " (" + phone + ")";
}
}
public class Main {
public static void main(String[] args) {
List<Lottery> list = new ArrayList<>();
list.add(new Lottery("Charlie", "01012345678"));
list.add(new Lottery("Alice", "01087654321"));
list.add(new Lottery("Bob", "01099887766"));
// ✅ Comparator를 사용하여 정렬 기준 변경 (전화번호 기준 정렬)
Collections.sort(list, new Comparator<Lottery>() {
@Override
public int compare(Lottery o1, Lottery o2) {
return o1.phone.compareTo(o2.phone); // ✅ 전화번호 기준 정렬
}
});
System.out.println(list);
}
}
출력결과
[Charlie (01012345678), Alice (01087654321), Bob (01099887766)]
Comparator를 사용하여 기본 정렬이 아닌 "전화번호 기준 정렬"이 적용됨
728x90
반응형