[Rust/러스트] 해쉬맵(HashMap) 다루기

2022. 2. 21. 17:00Programming Language/Rust

반응형

■ 해쉬맵

HashMap은 키(key) 와 값(value)가 쌍으로 하는 데이터 구조를 갖고 있으며, 키와 값은 각각 동일한 타입으로 설정해야 한다. HashMap은 키를 이용하여 값을 조회할 수 있습니다.


◆ 해쉬맵 생성

해쉬맵을 생성하는 방법은 두가지입니다.

 

첫번째, HashMap 구조체의 new 함수를 활용한 생성

fn main(){
    use std::collections::HashMap;

    // HashMap 생성
    let mut hash_ages : HashMap<String, u32> = HashMap::new();
    // 데이터 삽입
    hash_ages.insert(String::from("Hyunmin Han"), 29);
    
    println!("HashMap : {:?}", hash_ages);
}

▶ 출력 결과

HashMap : {"Hyunmin Han": 29}

두번째, collect 메소드를 활용한 생성, iter 함수 앞 벡터가 HashMap의 키가 되고, zip 함수의 파라미터가 HashMap의 값이 됩니다.

fn main(){
    use std::collections::HashMap;
    // HashMap의 키에 해당하는 벡터 생성
    let names  = vec![String::from("Hyunmin Han"), String::from("Donghun Lee")];
    // HashMap의 값에 해당하는 벡터 생성
    let ages = vec![10, 50];
    // HashMap 생성
    let hash_ages: HashMap<_, _> = names.iter().zip(ages.iter()).collect();

    println!("HashMap : {:?}", hash_ages);
}

▶ 출력 결과

HashMap : {"Hyunmin Han": 10, "Donghun Lee": 50}

◆ 해쉬맵 조회

해쉬맵을 조회하는 방법은 두가지입니다.

 

첫번째, 대괄호([])와 HashMap의 키를 활용해서 HashMap의 값 조회(해당하는 HashMap의 키가 없을 경우 프로그램이 panic 될 수 있으니 주의가 필요합니다.)

 

두번째, get 함수에 HashMap의 key를 파라미터로 넘김으로써, HashMap의 값을 Option<&T>으로 조회(해당하는 HashMap의 키가 없을 경우 None을 반환합니다.)

fn main(){
    use std::collections::HashMap;
    
    let mut hash_ages : HashMap<String, u32> = HashMap::new();

    // 신규 등록
    hash_ages.entry(String::from("Hyunmin")).or_insert(28);
    println!("HashMap : {:?}", hash_ages["Hyunmin"]);
    println!("HashMap : {:?}", hash_ages.get("Hyunmin"));
}

▶ 출력 결과

HashMap : 28
HashMap : Some(28)

◆ 해쉬맵 갱신

해쉬맵을 갱신하는 방법은 세가지입니다.

 

첫번째, HashMap에 insert 함수를 통해 데이터를 추가할 때, 기존에 HashMap의 키가 있을 경우 HashMap의 값은 덮어쓰기 되며, 기존 HashMap의 키가 없을 경우 새롭게 추가됩니다.

 

예시) 신규 등록 이후 "Hyunmin" 이라는 HashMap의 키에 해당하는 HashMap의 값이 30으로 덮어쓰기된 것을 확인할 수 있습니다.

fn main(){
    use std::collections::HashMap;
    // HashMap 생성
    let mut hash_ages : HashMap<String, u32> = HashMap::new();
    // 신규 추가
    hash_ages.insert(String::from("Hyunmin"), 29);
    // 덮어쓰기
    hash_ages.insert(String::from("Hyunmin"), 30);
    // 신규 추가
    hash_ages.insert(String::from("Donghun"), 28);

    println!("HashMap : {:?}", hash_ages);
}

▶ 출력 결과

HashMap : {"Hyunmin": 30, "Donghun": 28}

두번째, HashMap에 entry 함수와 or_insert 함수를 활용하여 기존에 HashMap의 키가 있을 경우 등록하지 않고, 기존 HashMap의 키가 없을 경우 새롭게 추가합니다.

fn main(){
    use std::collections::HashMap;
    // HashMap 생성
    let mut hash_ages : HashMap<String, u32> = HashMap::new();
    // 신규 추가
    hash_ages.entry(String::from("Hyunmin")).or_insert(28);
    // 키가 있을 경우 등록하지 않음.
    hash_ages.entry(String::from("Hyunmin")).or_insert(29);
    // 신규 추가
    hash_ages.entry(String::from("Donghun")).or_insert(30);

    println!("HashMap : {:?}", hash_ages);
}

▶ 출력 결과

HashMap : {"Hyunmin": 28, "Donghun": 30}

세번째, HashMap에 entry 함수의 리턴값(&mut [값 타입])에 역참조자(*)를 활용한 HashMap의 값 수정

fn main(){
    use std::collections::HashMap;
    // HashMap 생성
    let mut hash_ages : HashMap<String, u32> = HashMap::new();
    // 신규 등록
    let age = hash_ages.entry(String::from("Hyunmin")).or_insert(28);
    // 역참조자를 활용하여 값 수정
    *age = 29;

    println!("HashMap : {:?}", hash_ages);
}

▶ 출력 결과

HashMap : {"Hyunmin": 29}
반응형