코딩테스트

Sort a HashMap in Java - (3) TreeSet

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) 로 정렬된 내용에 중복이 없는 것을 확인 할 수 있다.

 

 

 

참고 : www.baeldung.com/java-hashmap-sort

728x90