언어(Language)/Java

[Java] 자바 TreeMap 개념 정리 및 활용

잇트루 2022. 9. 23. 06:00
반응형

트리맵 (TreeMap)

TreeMap은 TreeSet과 동일하게 이진 탐색 트리 형태로 데이터를 저장한다.

하지만, Set 인터페이스의 특성과는 달리 Map 특성을 사용하기 때문에 키(Key)와 값(Value)으로 이루어진 Entry 객체 형태로 저장한다.

 

이진 탐색 트리(Binary Search Tree)는 하나의 부모 노드가 최대 두 개의 자식 노드와 연결된 형태로 데이터를 저장한 자료 구조이다.

이진 탐색 트리는 이진 트리(Binary Tree)의 일종으로 정렬과 검색에 특화된 자료 구조이다.

최상위 노드를 루트 노드라 하며 그림의 10에 해당된다.

이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모 노드보다 작고, 모든 오른쪽 자식의 값은 루트나 부모 노드보다 큰 값을 가지는 것이 특징이다.

따라서, TreeMap은 TreeSet과 동일하게 값을 추가하면 정렬도 함께 실시하게 된다. 이는 HashMap과는 다른 점이기도 하다.

 

이진 탐색 트리는 다음과 같은 형태로 구현된다.

class Node {
    Object element; // 객체의 주소값을 저장하는 참조변수
    Node left; // 왼쪽 자식 노드의 주소값을 저장하는 참조변수
    Node right; // 오른쪽 자식 노드의 주소값을 저장하는 참조변수
}

 

TreeMap 활용 예제

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapEx {
    public static void main(String[] args) {
        // TreeMap 생성
        TreeMap<Integer, String> treeMap = new TreeMap<>();

        // TreeMap Entry 객체 저장
        treeMap.put(1, "부산");
        treeMap.put(2, "인천");
        treeMap.put(3, "대구");
        treeMap.put(4, "대전");
        treeMap.put(5, "광주");
        treeMap.put(6, "울산");

        // 저장된 총 Entry 수 얻기
        int size = treeMap.size();
        System.out.println(size);

        // 객체 찾기
        Object object = treeMap.get(1);
        System.out.println(object);

        // key를 요소로 가지는 Set 생성
        Set<Integer> keySet = treeMap.keySet();
        System.out.println(keySet);

        // value 값 읽기
        Iterator<Integer> keyIterator = keySet.iterator();
        while (keyIterator.hasNext()) {
            Integer key = keyIterator.next();
            String value = treeMap.get(key);
            System.out.println("키: " + key + " 값: " + value);
        }

        // 객체 삭제 후 크기 출력
        treeMap.remove(1);
        System.out.println(treeMap.size());

        // entrySet()을 활용한 value 값 읽기
        for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {
            System.out.println("키: " + entry.getKey() + " 값: " + entry.getValue());
        }
    
        // Entry 객체를 활용한 값 읽기
        Map.Entry<Integer, String> entry = null;
        entry = treeMap.firstEntry();
        System.out.println("키: " + entry.getKey() + " 값: " + entry.getValue());

        entry = treeMap.lastEntry();
        System.out.println("키: " + entry.getKey() + " 값: " + entry.getValue());

        entry = treeMap.higherEntry(5);
        System.out.println("키: " + entry.getKey() + " 값: " + entry.getValue());

        entry = treeMap.lowerEntry(6);
        System.out.println("키: " + entry.getKey() + " 값: " + entry.getValue());

        // 전체 객체 삭제
        treeMap.clear();
    }
}

TreeMap의 사용 방법은 HashMap과 매우 유사하게 다룰 수 있다. 하지만 TreeMap은 키 값에 따라 오름차순으로 자동 정렬이 되기 때문에 Set() 메서드를 활용하지 않더라도 순서를 알고 있으면 직접적으로 접근하기가 더욱 쉽다.

반응형