2021-01-14
TreeMap에서는 Tree라는 개념이 중요하다. 이는 이진트리 구조를 뜻하는데, 아래 보이는 노드들이 바로 이진트리 형태의 구조이다.
맨 위의 시작 노드를 보통 루트(root)라고 불리며, 나머지는 n개의 자식 노드들로 구성되어 있다. (하위 노드 위에 루트 노드를 제외한 인접한 상위 노드가 있다면 그 상위 노드를 부모 노드라고 부르기도 한다.) 해당 구조를 자세히 보면 같은 자식이라도 왼쪽은 작은 자식 오른쪽은 큰 자식이라고 된 것을 볼 수 있는데, 이는 마찬가지로 아래 이진트리를 보면 이해가 쉬울 것이다.
부모(상위) 노드를 기준으로 큰 값은 우측 작은 값은 좌측에 저장된다. 자 이제 tree 구조 설명을 됐으니 TreeMap을 살펴보자.
TreeMap의 가장 큰 장점은 객체를 저장하면 자동으로 정렬이 된다는 점이다!(개꿀)
package tTreeMap;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap;
public class main {
public static void main(String[] args) {
TreeMap<Integer, String> tMap = new TreeMap<Integer, String>();
tMap.put(5, "fff");
tMap.put(3, "bbb");
tMap.put(2, "ccc");
tMap.put(7, "ddd");
tMap.put(1, "aaa");
}
}
map 자료구조 특징상 key값과 value 값을 제네릭 타입으로 넣어주어야한다. 우선 key는 Integer / value는 String을 주었다. 다음 put 메서드를 통해 순서 상관없이 데이터를 입력해 주었다.
ThreeMap을 키값에 따라 오름차순으로 자동정렬되며, 우선 가장 첫 번째 값과(가장 작은 key) 마지막 값(가장 큰 key)을 출력해보자.
package tTreeMap;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap;
public class main {
public static void main(String[] args) {
TreeMap<Integer, String> tMap = new TreeMap<Integer, String>();
tMap.put(5, "fff");
tMap.put(3, "bbb");
tMap.put(2, "ccc");
tMap.put(7, "ddd");
tMap.put(1, "aaa");
Map.Entry<Integer, String> entry = null;
entry = tMap.firstEntry();
System.out.println(entry.getKey() +" "+ entry.getValue() );
//가장 키값이 작은값 출력
entry = tMap.lastEntry();
System.out.println(entry.getKey() +" "+ entry.getValue() );
//가장 키값이 큰값 출력
}
}
위와 같이 entry로 전체 객체를 한 번 담아주고 entry의 get메서드를 통해 key와 value값을 출력해 보았다. 아래 출력문을 보듯이 key순으로 정렬되어 원하는 값이 출력되는 것을 확인할 수 있다.
그러면 여기서 궁금한 점이 생길 수 있다. 그러면 내림차순으로 정렬하고 싶을땐 어떻게 하지? 이를 위해 TreeMap을 descendingMap()이라는 메서드를 제공한다. 이 메서드는 리턴 값이 NavigableMap이기 때문에 해당 구조로 다시 한번 감싸 주어야 한다. 이제 코드를 살펴보자.
package tTreeMap;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap;
public class main {
public static void main(String[] args) {
TreeMap<Integer, String> tMap = new TreeMap<Integer, String>();
tMap.put(5, "fff");
tMap.put(3, "bbb");
tMap.put(2, "ccc");
tMap.put(7, "ddd");
tMap.put(1, "aaa");
System.out.println("__________________________________________________");
NavigableMap<Integer, String> desc = tMap.descendingMap();
Set<Map.Entry<Integer,String>> descS = desc.entrySet();
for(Map.Entry<Integer,String> entry1 : descS) {
System.out.println(entry1.getKey() + " " + entry1.getValue());
}
}
}
NavigableMap로 감싸준 TreeMap을 하나씩 출력해주기 위해서 entrySet으로 묶은 후 for문으로 하나씩 뽑아 출력해 보았다. 콘솔에 보이듯이 정상적으로 내림차순 정렬이 된 것을 확인할 수 있다.