Rust - HashMap 알아보기 (get/insert/remove/contains)

HashMap은 key-value pair(Entry)를 저장하며, 중복된 key 값은 저장되지 않습니다. 또한, Entry는 저장되는 순서와 다르게 HashMap 내부에서 임의의 순서로 저장됩니다.

1. HashMap 생성 및 초기화

HashMap<TYPE1, TYPE2>는 key의 타입이 TYPE1이고, value의 타입이 TYPE2인 HashMap을 선언합니다.

HashMap::new()로 HashMap 객체를 생성할 수 있습니다.

let mut my_map: HashMap<&str, &str> = HashMap::new();

insert(key, value)로 HashMap에 데이터를 추가할 수 있으며, 이런 경우 key와 value의 타입을 컴파일러가 알고 있기 때문에 HashMap을 선언할 때 타입을 생략해도 됩니다.

use std::collections::HashMap;

fn main() {
    let mut my_map = HashMap::new();
    my_map.insert("a", "10");
    my_map.insert("b", "20");
    my_map.insert("c", "30");

    println!("{:?}", my_map);
}   

Output:

{"b": "20", "a": "10", "c": "30"}

2. HashMap에 Entry 추가: insert()

위의 예제에서 소개한 것처럼 push(key, value)는 key-value pair를 HashMap에 추가합니다.

  • HashMap은 중복 key를 허용하지 않음(동일한 key의 Entry가 2개 이상 저장되지 않음)
  • 만약 중복 key로 Map에 Entry를 추가를 하면, 마지막에 추가된 value로 Entry가 업데이트됨
use std::collections::HashMap;

fn main() {
    let mut my_map: HashMap<&str, &str> = HashMap::new();
    my_map.insert("a", "10");
    my_map.insert("b", "20");
    my_map.insert("c", "30");
    my_map.insert("a", "40");

    println!("{:?}", my_map);
}

Output:

{"a": "40", "b": "20", "c": "30"}

3. HashMap에서 Entry 접근: get()

get(key)는 HashMap에서 key를 찾고 value를 Option 타입으로 리턴합니다.

use std::collections::HashMap;

fn main() {
    let mut my_map: HashMap<&str, &str> = HashMap::new();
    my_map.insert("a", "10");
    my_map.insert("b", "20");
    my_map.insert("c", "30");

    let ret = my_map.get("b");
    println!("Found {:?}", ret);
}

Output:

Found Some("20")

Option 타입 안에 value가 저장되어있는데, 아래와 같이 match 키워드로 value에 접근할 수 있습니다.

  • HashMap에 찾으려는 key가 없으면 None이 리턴되어 예외처리 가능
  • HashMap에 찾으려는 key가 있으면 Some이 리턴되어 value에 접근할 수 있음
use std::collections::HashMap;

fn main() {
    let mut my_map: HashMap<&str, &str> = HashMap::new();
    my_map.insert("a", "10");
    my_map.insert("b", "20");
    my_map.insert("c", "30");

    match my_map.get("b") {
        Some(value) => {
            println!("Found value: {}", value);
        }
        None => {
            println!("Nothing found");
        }
    }
}

Output:

Found value: 20

아래와 같이 더 짧은 코드로 match 구문을 작성할 수 있습니다.

match my_map.get(&"b") {
    Some(value) => println!("Found value: {}", value),
    None => println!("Nothing found")
}

4. HashMap의 Entry 제거: remove()

remove(&key)는 HashMap에서 key와 일치하는 Entry를 삭제합니다.

use std::collections::HashMap;

fn main() {
    let mut my_map: HashMap<&str, &str> = HashMap::new();
    my_map.insert("a", "10");
    my_map.insert("b", "20");
    my_map.insert("c", "30");
    println!("{:?}", my_map);

    // "b" 삭제 후 확인
    my_map.remove(&"b");
    println!("{:?}", my_map);
}

Output:

{"b": "20", "a": "10", "c": "30"}
{"a": "10", "c": "30"}

5. 특정 key 포함 여부 확인: contains_key()

contains_key(key)는 HashMap에 key가 저장되어있을 때 true를 리턴합니다.

use std::collections::HashMap;

fn main() {
    let mut my_map: HashMap<&str, &str> = HashMap::new();
    my_map.insert("a", "10");
    my_map.insert("b", "20");
    my_map.insert("c", "30");

    if my_map.contains_key("b") {
        println!("Has key 'b'");
    }
}

Output:

Has key 'b'

6. HashMap의 모든 Entry 순회

iter()는 HashMap의 모든 Entry를 가리키는 Iterator를 리턴합니다.

아래와 같이 for문으로 모든 Entry(key-value)를 참조할 수 있습니다.

use std::collections::HashMap;

fn main() {
    let mut my_map: HashMap<&str, &str> = HashMap::new();
    my_map.insert("a", "10");
    my_map.insert("b", "20");
    my_map.insert("c", "30");

    for (key, val) in my_map.iter() {
        println!("key: {}, val: {}", key, val);
    }
}

Output:

key: c, val: 30
key: a, val: 10
key: b, val: 20

7. HashMap 길이: len()

len()는 HashMap에 저장된 Entry들의 개수를 리턴합니다.

use std::collections::HashMap;

fn main() {
    let mut my_map: HashMap<&str, &str> = HashMap::new();
    my_map.insert("a", "10");
    my_map.insert("b", "20");
    my_map.insert("c", "30");

    println!("length: {}", my_map.len());
}

Output:

length: 3
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha