Treemap

컬렉션의 정렬

TreeSet과 TreeMap

지난 시간에는 Collection과 Map에 대해 알아보았습니다. 이번 시간에는 좀더 주제를 발전시켜서 Sorted 계열인 TreeSet과 TreeMap에 대해 알아보겠습니다. 지난 시간을 통해 Set과 Map의 차이점에 대해서는 어느 정도 학습이 되었으리라 생각합니다.

Set은 저장 순서와 상관없이 데이터의 존재 유무가 중요한 포인트이며 중복을 허용하지 않습니다. Map은 키와 값이라는 개념을 사용하여 연관배열(Associate Array)과 비슷한 개념의 자료구조를 만듭니다. Map에서 데이터는 유일한 키에 의해 저장되며, 데이터를 참조할 경우 키에 의해 참조하게 됩니다. 결과적으로 키들만을 놓고 본다면 Set의 구조를 가지게 됩니다.

Set과 Map의 경우 저장 순서가 의미를 갖지 않으므로 순서의 개념이 없으나 프로그램을 위해 정렬을 해야될 필요가 있게 됩니다. 이러한 경우를 위해 정렬의 개념을 도입한 TreeSet과 TreeMap이 제공됩니다.

일반적으로 Set의 경우 HashSet을 가장 많이 사용하며, Map의 경우 HashMap을 가장 많이 사용하게 되는데 이 HashSet과 HashMap을 정렬시키기 위해 TreeSet과 TreeMap으로 변환하여 사용합니다.

package net.jeongsam.collection;

import java.util.*;

class SortedEx02 {

	public static void main(String[] args) {
		HashSet<String> hSet = new HashSet<String>();
		HashMap<String, Integer> hMap = new HashMap<String, Integer>();
		
		Collections.addAll(hSet, "송아지", "강아지", "송아지", "망아지");
		
		hMap.put("홍길동", 150);
		hMap.put("김삿갓", 10);
		hMap.put("성춘향", 8);
		
		System.out.println("--- 정렬전 ---");
		System.out.println("Set: " + hSet);
		System.out.println("Map: " + hMap);
		
		TreeSet<String> tSet = new TreeSet<String>();
		TreeMap<String, Integer> tMap = new TreeMap<String, Integer>();

		// Set.addAll() 을 이용하여 HashSet을 추가
		tSet.addAll(hSet);
		// Map.putAll() 을 이용하여 HashMap을 추가
		tMap.putAll(hMap);
		
		System.out.println("--- 정렬후 ---");
		System.out.println("Set: " + tSet);
		System.out.println("Map: " + tMap);
	}

}

사용자 정의 타입의 정렬

TreeSet에 데이터를 저장하면 원시 데이터 타입이나 문자열의 경우 기본적으로 오름차순으로 정렬이 됩니다. 하지만 사용자가 직접 작성한 클래스 타입의 경우 Comparator 인터페이스를 구현해야만 정렬을 할 수 있습니다. Comparator 인터페이스는 compare() 추상 메서드만을 정의하였기 때문에 compare() 메서드를 구현하면 됩니다.

package net.jeongsam.collection;

public class Pet {
	private String name;
	
	public Pet(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

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

	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object o) {
		boolean isEqual = false;
		if ((o instanceof Pet) && ((Pet)o).name.equals(name)) {
			isEqual = true;
		}
		
		return isEqual;
	}

	@Override
	public String toString() {
		return name;
	}
}
package net.jeongsam.collection;

import java.util.Comparator;

public class MyComparator<T> implements Comparator<T> {
	
	@Override
	public int compare(T o1, T o2) {
		String s1 = ((Pet)o1).getName();
		String s2 = ((Pet)o2).getName();
		
		return (s1.compareTo(s2));
	}

}
package net.jeongsam.collection;

import java.util.*;

class SortedEx03 {

	public static void main(String[] args) {
		TreeSet<Pet> setPet = new TreeSet<Pet>(new MyComparator<Pet>());
		
		Collections.addAll(setPet, new Pet("홍길동"), new Pet("이몽룡"), new Pet("성춘향"));
		
		System.out.println(setPet);	
	}
}

+ Recent posts