[기본 개념] 6 | (1.10) TreeMap, Properties

728x90

[기본 개념] 6 | (1.10) TreeMap, Properties

1 컬렉션 프레임웍의 핵심 인터페이스

2 ArrayList

3 LinkedList

4 Stack과 Queue

5 Iterator, Listlterator, Enumeration

6 Arrays

7 Comparator와 Comparable

8 HashSet

9 TreeSet

10 HashMap과 Hashtable

11> TreeMap

12> Properties

13 Collections

14 컬렉션 클래스 정리 & 요약

11. TreeMap

 TreeMap은 이진검색트리의 형태키와 값의 쌍으로 이루어진 데이터를 저장하여 검색과 정렬에 적합한 컬렉션 클래스이다.

 

 HashMap이 TreeMap보다 검색에 관한 대부분은 뛰어나므로 범위 검색이나 정렬이 필요한 경우 TreeMap을 사용한다.

 

예제/TreeMapEx1.java

import java.util.*;

public class TreeMapEx1 {
    public static void main(String[] args) {
        String[] data = {"A", "K", "K", "A", "K", "D", "K", "A", "Z", "K", "D", "K"};

        TreeMap map = new TreeMap();

        for (int i = 0; i < data.length; i++) {
            if (map.containsKey(data[i])) {
                Integer value = (Integer)map.get(data[i]);
                map.put(data[i], new Integer(value.intValue() + 1));
            } else {
                map.put(data[i], new Integer(1));
            }
        }

        Iterator it = map.entrySet().iterator();

        System.out.println("=== 기본정렬 ===");
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            int value = ((Integer)entry.getValue()).intValue();
            System.out.println(entry.getKey() +  " : " + printBar('#', value) + " " + value);
        }
        System.out.println();

        // map을 ArrayList로 변환한 다음에 Collections.sort()로 정렬

        Set set = map.entrySet();
        List list = new ArrayList(set); // ArrayList(Collection c)

        Collections.sort(list, new ValueComparator());

        it = list.iterator();

        System.out.println("=== 값의 크기가 큰 순서로 정렬 ===");
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            int value = ((Integer)entry.getValue()).intValue();
            System.out.println(entry.getKey() +  " : " + printBar('#', value) + " " + value);
        }
    }

    static class ValueComparator implements Comparator {
        public int compare(Object o1, Object o2) {
            if (o1 instanceof Map.Entry && o2 instanceof Map.Entry) {
                Map.Entry e1 = (Map.Entry)o1;
                Map.Entry e2 = (Map.Entry)o2;

                int v1 = ((Integer)e1.getValue()).intValue();
                int v2 = ((Integer)e2.getValue()).intValue();

                return v2 - v1;
            }
            return -1;
        }
    }

    public static String printBar(char ch, int value) {
        char[] bar = new char[value];

        for (int i = 0; i < bar.length; i++)
            bar[i] = ch;

        return new String(bar);     // String(char[] chArr)
    }
}
실행결과

=== 기본정렬 ===
A : ### 3
D : ## 2
K : ###### 6
Z : # 1

=== 값의 크기가 큰 순서로 정렬 ===
K : ###### 6
A : ### 3
D : ## 2
Z : # 1

 

 TreeMap을 사용했기 때문에 키가 오름차순으로 정렬되어 있다. 그리고 Comparator를 구현한 클래스와 Collections.sort(List list, Comparator c)를 이용해서 값에 대한 내림차순으로 정렬하는 방법을 보여준다.

 

12. Properties

 Properties는 HashMap의 구버전인 Hashtable을 상속받아 구현한 것으로, Hashtable은 키와 값을 Object의 형태로 저장하는데 Properties는 String의 형태로 저장한다.

 

 주로 어플리케이션의 환경설정과 관련된 속성을 저장하는 데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다.

 

예제/PropertiesEx1.java

import java.util.*;

public class PropertiesEx1 {
    public static void main(String[] args) {
        Properties prop = new Properties();

        // prop에 키와 값(key, value)을 저장한다.
        prop.setProperty("timeout", "30");
        prop.setProperty("language", "kr");
        prop.setProperty("size", "10");
        prop.setProperty("capacity", "10");

        // prop에 저장된 요소들을 Enumeration을 이용해서 출력한다.
        Enumeration e = prop.propertyNames();

        while (e.hasMoreElements()) {
            String element = (String)e.nextElement();
            System.out.println(element + " = " + prop.getProperty(element));
        }

        System.out.println();
        prop.setProperty("size", "20");
        System.out.println("size = " + prop.getProperty("size"));
        System.out.println("capacity = " + prop.getProperty("capacity", "20"));
        System.out.println("loadfactor = " + prop.getProperty("loadfactor", "0.75"));
        System.out.println(prop);
        prop.list(System.out);  // prop에 저장된 요소들을 화면에 출력한다.
    }
}
실행결과

capacity = 10
size = 10
timeout = 30
language = kr

size = 20
capacity = 10
loadfactor = 0.75         <-- loadfactor라는 키가 없기 때문에 디폴트 값으로 지정한 0.75가 출력
{capacity=10, size=20, timeout=30, language=kr}    <-- System.out.println(prop);
-- listing properties --
capacity=10
size=20
timeout=30
language=kr

 

 데이터를 저장하는 데 사용되는 setProperty( )는 단순히 Hashtable의 put메서드를 호출하며, 기존에 같은 키로 저장된 값이 있는 경우 그 값을 Object타입으로 반환하며, 그렇지 않으면 null을 반환한다.

 

 getProperty( )는 저장된 값을 읽어오는데 읽어오려는 키가 존재하지 않으면 지정된 기본값(defaultValue)을 반환한다.

 

 또한 Hashtable을 상속받아 구현한 것이기 때문에 Map의 특성상 저장 순서를 유지하지 않는다.

 

 

 

 

 

출처 | Java의 정석 (남궁 성)

728x90