코딩테스트

Sort a HashMap in Java - (1) TreeMap

728x90

TreeMap

TreeMap은 이진트리를 기반으로 한 Map 컬렉션이다.

 

TreeMap에 객체를 저장하면, key는 저장과 동시에 자동으로 오름차순으로 정렬된다. (숫자 - 값 오름차순 정렬 / 문자열 : 유니코드 순으로 정렬) 정렬 순서는 기본적으로 부모 키값과 비교해서 키 값이 낮은 것은 왼쪽 자식 노드에 키값이 높은 것은 오른쪽 자식 노드에 Map.Etnry 객체를 저장한다.

 

TreeMap은 일반적으로 HashMap보다 성능이 떨어진다.

그 이유는 TreeMap이 데이터를 저장할 때 정렬과정을 한 번 거치기 때문이다.

하지만 Map을 정렬상태로 유지해야하거나 정렬된 데이터를 조회해야 할 경우 TreeMap을 사용하는 것이 효율적이다.

즉, key-value쌍을 key를 기준으로 오름차순 정렬할 때 사용하기 좋은 방법이다.


사용법 : HashMap의 모든 데이터를 TreeMap으로 넣는다.

 

1. HashMap을 선언하고 초기화

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);

2. Employee 클래스는 Comparable<Employee> 를 implement

public class Employee implements Comparable<Employee>{

	private Long id;
	private String name;

	// constructor, getters, setters
	public Employee(long l, String string) {
		this.id = l;
		this.name = string;
	}

	public Long getId() { return id; }

	public void setId(Long id) { this.id = id; }

	public String getName() { return name; }

	public void setName(String name) { this.name = name; }

	// override equals and hashCode
	/*
	@Override
	public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Employee employee = (Employee) obj;
        return id == employee.id;
	}

	@Override
	public int hashCode() {
		return Objects.hash(id);
	}
	*/
    
	@Override
	public int compareTo(Employee employee) {
		return (int)(this.id - employee.getId());
	}

	@Override
	public String toString() {
		return "Employee {id=" + id + ", name='" + name + "'}";
	}

}

3. 생성자를 활용해서 TreeMap 에 항목 저장

TreeMap<String, Employee> sorted = new TreeMap<>(map);

또는 putAll 메서드를 사용해서 데이터를 복사

TreeMap<String, Employee> sorted = new TreeMap<>();
sorted.putAll(map);

4. 결과 출력

출력하면 map의 항목들이 key값을 기준으로 정렬된 모습을 볼 수 있다.

public class UsingTreeMap {
	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);
		
		//TreeMap<String, Employee> sorted = new TreeMap<>(map);
		TreeMap<String, Employee> sorted = new TreeMap<>();
		sorted.putAll(map);
		
		//key : String
		Iterator<String> iter = sorted.keySet().iterator();
		
    	while(iter.hasNext()) {
    		String name = iter.next();
    		Employee employee = sorted.get(name);
    		System.out.println(name+"="+employee.toString());
    	}
		
	}
}

결과

Annie=Employee{id=22, name='Annie'}
George=Employee{id=2, name='George'}
John=Employee{id=8, name='John'}
Mher=Employee{id=1, name='Mher'}

 

 

 

 

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

coding-factory.tistory.com/557

728x90