Java

TreeMap

amungstudy 2023. 10. 25. 12:03

Map을 이용할 때 key를 오름차순 정렬해서 값을 가져올 수 없을까?

이것을 TreeMap이 해결해준다.

 

검색 기능을 강화시킨 컬렉션은 TreeSet, TreeMap이 있다.

이진트리구조를 사용하기 때문에 검색 속도가 향상된다.

TreeMap의 구조

주요 메소드

단일 노드 객체를 찾는 메소드 : firstEntry(), lastEntry(), lowerEntry(), hightEntry()..

정렬 메소드 : descendingKeySet(), descendingMap()

범위 검색 메소드 : headMap(), tailMap, subMap()


 

TreeMap은 키를 정렬된 순서로 유지한다. 기본적으로 오름차순이다.

단, TreeMap을 사용할때는 성능 상의 고려사항이 있을 수 있다.

대량의 데이터를 다루는 경우나 빈번한 삽입/삭제가 필요한 경우 다른 구조를 사용하는 것이 좋다.

하지만 정렬된 상태로 Map을 유지하거나 정렬된 데이터를 조회하는 범위검색이 필요한 경우에는 더 좋다.

 

* key값을 이용해서 value를 찾는 경우 많은 양의 데이터를 가져올때는

keySet()보다는 key와 value 모두 가지고 있는 entrySet()을 이용하자(성능저하방지)

 

 


예제)

https://school.programmers.co.kr/learn/courses/30/lessons/120896

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을

 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.


public String solution(String s) {
    Map<String,Integer> map = new TreeMap<>();
    String[] arr = s.split("");

    for(String target : arr){
        if(map.containsKey(target)){
            int count = map.get(target)+1;
            map.put(target,count);
        }else{
            map.put(target,1);
        }
    }
    String answer = "";
    for(String key : map.keySet()){
        if(map.get(key)==1){
            answer += key;
        }
    }
    return answer;
}

if 조건문이 너무 많아서 수정했다.

 

 


public static String solution(String s) {
    Set<Character> set = new TreeSet<>();
    for(int i = 0; i<s.length(); i++){
        String replace = s.replace(s.charAt(i)+"","");
        if(s.length()-replace.length() ==1){
            set.add(s.charAt(i));
        }
    }
    String answer = "";
    Iterator<Character> itr = set.iterator();
    while(itr.hasNext()){
        answer += itr.next();
    }

    return answer;

}

TreeSet은 정렬을 위해 사용했는데... 맘에 안든다 또 고쳐봐야지