C.W.K.
Stream
Lesson 03 of 06 · published

HashMap & BTreeMap

~11 min · collections, hashmap, btreemap, entry

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

위치가 아니라 키로 뭔가를 찾아야 할 때 맵으로 손 뻗어. Rust 의 일꾼은 HashMap<K, V> 고, 정렬 대안으로 BTreeMap 이 있어.

HashMap 기본

HashMap<K, V> 는 키-값 쌍을 평균 O(1) 조회로 저장해. insert 는 추가하거나 교체; getOption<&V> 를 반환해 — 키가 없을 수 있으니 Option 이 또 나와. 키는 hashable 하고 비교 가능해야 하는데, 대부분 표준 타입이 기본으로 그래.

entry API

킬러 기능은 entry 야: map.entry(key).or_insert(0) 가 값으로의 가변 참조를 주고, 키가 없으면 기본값을 삽입해. get-check-insert 춤 없이 '카운터 증가' 나 '키마다 리스트에 append' 를 하는 깔끔한 방법이야. entry 는 표준 라이브러리에서 제일 사랑받는 메서드 중 하나야.

entry().or_insert() 는 세는 관용구야. 발생 횟수를 집계하려면 *map.entry(word).or_insert(0) += 1; 이 '처음 봄' 이랑 '전에 봄' 둘 다 한 줄, 한 조회로 처리해. 수동 if contains_key 검사로 손 뻗는 게 초보 티야 — 조회를 두 번 하고 더 못 읽혀.

HashMap vs BTreeMap

HashMap 은 무순서고 빨라. BTreeMap 은 키를 정렬 유지해 (순회가 순서대로) 작은 조회 비용으로. 기본은 HashMap; 정렬 순회나 범위 쿼리가 필요하면 BTreeMap 으로 손 뻗어. 같은 API 모양, 다른 순서 보장.

Code

entry API 로 단어 빈도 세기·rust
use std::collections::HashMap;

fn main() {
    let text = "the cat the dog the bird";
    let mut counts: HashMap<&str, u32> = HashMap::new();

    // entry 관용구: 한 줄에 삽입-또는-증가
    for word in text.split_whitespace() {
        *counts.entry(word).or_insert(0) += 1;
    }

    // get 은 Option 반환 — 키가 없을 수 있음
    println!("the: {:?}", counts.get("the"));   // Some(3)
    println!("fish: {:?}", counts.get("fish")); // None
}

External links

Exercise

HashMap 이랑 entry().or_insert() 관용구로 문장의 단어 빈도를 세봐. 그다음 HashMapBTreeMap 으로 바꾸고 순회해 — 이제 키가 정렬돼 나오는 걸 봐. BTreeMap 의 정렬 순회가 약간 느린 조회를 감수할 가치는 언제야?
Hint
결정론적이고 정렬된 출력이 필요할 때 BTreeMap 을 써 (리더보드, 리포트, 'A 와 M 사이 모든 키' 같은 범위 쿼리). 빠른 조회만 필요하고 순서가 상관없으면 HashMap.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.