TreeSet
이진 트리 를 기반으로한 Set Collection이다. TreeSet에 객체를 저장하면 자동으로 정렬되는데 이진탐색트리 처럼 부모 노드값과 비교해 낮으면 왼쪽 자식노드, 높으면 오른쪽 자식 노드에 저장한다.
Copy TreeSet < E > treeSet = new TreeSet < E >();
Copy TreeSet < Integer > scores = new TreeSet < Integer >();
scores . add ( new Integer( 87 ) );
scores . add ( new Integer( 95 ) );
scores . add ( new Integer( 90 ) );
System . out . println ( "first() : " + scores . first ());
Copy NavigableSet < Integer > descendingSet = treeSet . descendingSet ();
만약 오름차순 정렬을 하고 싶다면, descendingSet()을 두번 호출하면된다.
Copy NavigableSet < Integer > ascendingSet = descendingSet . descendingSet ();
Copy TreeSet < String > treeSet = new TreeSet < String >();
treeSet . add ( "banana" );
treeSet . add ( "apple" );
treeSet . add ( "grape" );
treeSet . add ( "cherry" );
treeSet . add ( "strawberry" );
NavigableSet < String > rangeSet = treeSet . subSet ( "c" , true , "f" , true );
for ( String word : rangeSet){
System . out . println (word); // cherry
}
TreeMap
TreeMap은 이진 트리를 기반으로 한 Map Collection이다. TreeSet과의 차이점은 키와 값이 저장된 Map.Entry를 저장한다는 점이다. 키값을 비교해서 자동으로 정렬된다.
Copy TreeMap < K , V > treeMap = new TreeMap < K , V >();
Map 인터페이스 타입 변수에 대입해도되지만 TreeMap 클래스 타입으로 대입한 이유는 특정 객체를 찾거나 범위 검색과 관련된 메소드 를 사용하기 위해서이다.
오름차순 정렬하고 싶다면, descendingMap()을 두번 호출하면된다.
Copy TreeMap < String , Integer > TreeMap = new TreeMap < String , Integer >();
TreeMap . put ( "banana" , new Integer( 10 ) );
TreeMap . put ( "apple" , new Integer( 50 ) );
TreeMap . put ( "grape" , new Integer( 30 ) );
TreeMap . put ( "cherry" , new Integer( 20 ) );
TreeMap . put ( "strawberry" , new Integer( 40 ) );
NavigableMap < String , Integer > rangeMap = TreeMap . subMap ( "c" , true , "f" , true );
for ( Map . Entry < String , Integer > entry : rangeMap . entrySet ()){
System . out . println ( entry . getKey ()); // cherry
}
Comparable, Comparator
TreeSet과 TreeMap은 정렬을 위해 java.lang.Comparable
을 구현한 객체를 요구한다. 만약 Comparable을 구현하고 있지 않을 경우에는 저장하는 순간 ClassCastException이 발생한다. 이때, 생성자의 매개 값으로 Comparator를 제공하면 Comparable이 없는 객체도 정렬시킬 수 있다.
혹은 사용자 정의 클래스에서 compareTo()
메소드를 오버라이딩하여 구현하면된다.
Comparable
Copy public class Fruit implemets Comparable< Fruit >{
public String name;
public Integer stock;
...
@ Override
public int compareTo ( Fruit o){
// 로직
}
}
Comparator
Copy public class DescendingComparator implements Comparator < Fruit >{
@ Override
public int compare ( Fruit o1 , Fruit o2){
// 로직
}
}
Copy TreeSet < Fruit > treeSet = new TreeSet < Fruit >( new DescendingComparator() )