카테고리 없음

TreeSet과 Collections.sort()의 차이

jjhim531 2025. 2. 27. 07:36
반응형

 

기능 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
반응형