728x90
TreeSet
정렬된 컬렉션에 중복된 값을 허용하고 싶지 않을 경우, TreeSet을 이용할 수 있다.
Set 컬렉션의 경우 순서가 유지되지 않고, 중복이 허용되지 않는 특징을 가진다.
그런데 Set<E> 인터페이스를 구현하는 TreeSet<E> 클래스는 트리(Tree)라는 자료구조를 기반으로 구현되어있다.
따라서, TreeSet<E> 클래스는 데이터를 정렬된 상태로 유지한다.
TreeSet<E> treeSet = new TreeSet<E>();
- Comparable 인터페이스를 구현하여 compareTo 메서드를 @오버라이딩 해야만 TreeSet에 저장할 수 있다. (정렬기준 제공)
- TreeSet에 Integer를 저장하면 숫자의 크고 작음을 기준으로 정렬되어 저장되고, String의 경우 정렬순서는 문자의 코드값이 기준이 된다.
더보기
기본 Set 컬렉션 출력 시 유의할 점
( TreeSet은 정렬된 상태로 유지할 수 있기 때문에 예외 )
순서가 유지되지 않기 때문에 인덱스가 없어서 출력 시 for문을 돌릴 수가 없다.
따라서 Iterator, Enumeration 를 사용해서 컬렉션에 저장된 각 요소에 접근한다.
Collection 인터페이스에서는 Iterator를 반환하는 iterator() 가 있고,
List, Set은 Collection 인터페이스의 자식이므로 Iterator 사용이 가능하다.
Iterator<E> iterator()
: 인터페이스를 구현한 구현체(자식클래스)의 객체 리턴
먼저 테스트를 위해 중복된 데이터를 map에 추가로 저장한다.
Employee employee5 = new Employee(1L, "Mher");
map.put(employee5.getName(), employee5);
Employee employee6 = new Employee(22L, "Annie");
map.put(employee6.getName(), employee6);
1. Key로 정렬
SortedSet<String> keySet = new TreeSet<>(map.keySet());
적용
public class UsingTreeSet {
public static void main(String[] args) {
Map<String, Employee> map = new HashMap<>();
Employee employee1 = new Employee(1L, "Mher");
map.put(employee1.getName(), employee1);
Employee employee2 = new Employee(22L, "Annie");
map.put(employee2.getName(), employee2);
Employee employee3 = new Employee(8L, "John");
map.put(employee3.getName(), employee3);
Employee employee4 = new Employee(2L, "George");
map.put(employee4.getName(), employee4);
Employee employee5 = new Employee(1L, "Mher");
map.put(employee5.getName(), employee5);
Employee employee6 = new Employee(22L, "Annie");
map.put(employee6.getName(), employee6);
//key 값으로 정렬
SortedSet<String> sorted = new TreeSet<>(map.keySet());
for(String name : sorted) {
System.out.println(name);
}
}
}
결과
중복없이 정렬된 key값들을 얻을 수 있다.
Annie
George
John
Mher
2. Value로 정렬
마찬가지로, value 값을 정렬할 때도 활용할 수 있다.
SortedSet<Employee> values = new TreeSet<>(map.values());
적용
public class UsingTreeSet {
public static void main(String[] args) {
Map<String, Employee> map = new HashMap<>();
Employee employee1 = new Employee(1L, "Mher");
map.put(employee1.getName(), employee1);
Employee employee2 = new Employee(22L, "Annie");
map.put(employee2.getName(), employee2);
Employee employee3 = new Employee(8L, "John");
map.put(employee3.getName(), employee3);
Employee employee4 = new Employee(2L, "George");
map.put(employee4.getName(), employee4);
Employee employee5 = new Employee(1L, "Mher");
map.put(employee5.getName(), employee5);
Employee employee6 = new Employee(22L, "Annie");
map.put(employee6.getName(), employee6);
//value 값으로 정렬
SortedSet<Employee> values = new TreeSet<>(map.values());
for(Employee emp : values) {
System.out.println(emp.toString());
}
}
}
결과
Employee {id=1, name='Mher'}
Employee {id=2, name='George'}
Employee {id=8, name='John'}
Employee {id=22, name='Annie'}
결과에서 알수 있듯이, value값 (id) 로 정렬된 내용에 중복이 없는 것을 확인 할 수 있다.
728x90
'코딩테스트' 카테고리의 다른 글
Sort a HashMap in Java - (5) Using the Guava library (4) | 2021.03.18 |
---|---|
Sort a HashMap in Java - (4) Using the Stream API (0) | 2021.03.18 |
Sort a HashMap in Java - (2) Using ArrayList (0) | 2021.03.18 |
Sort a HashMap in Java - (1) TreeMap (0) | 2021.03.18 |
Sort a HashMap in Java - Sort Function 완성하기 (0) | 2021.03.18 |