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

Set는 중복이 없는 value들을 저장하는 구조이며, 저장 순서를 보장하지 않습니다.

러스트의 std::collections 모듈에서 HashSet을 지원합니다. 어떻게 사용하는지 알아보겠습니다.

1. HashSet 생성 및 초기화

HashSet<TYPE>은 TYPE 타입 데이터를 저장하는 HashSet을 선언하며, HashSet::new()로 비어있는 HashSet을 생성할 수 있습니다.

let mut my_set: HashSet<&str> = HashSet::new();

컴파일러가 추론을 통해 타입을 알 수 있는 경우라면, 아래와 같이 타입을 입력하지 않아도 암시적으로 타입이 설정됩니다.

use std::collections::HashSet;

fn main() {
    let mut my_set = HashSet::new();
    my_set.insert("apple");

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

Output:

{"apple"}

생성과 동시에 초기화

HashSet::from(array)는 HashSet을 생성할 때 array의 요소들을 HashSet에 추가합니다.

아래와 같이 HashSet 생성과 동시에 초기 값을 설정할 수 있습니다.

use std::collections::HashSet;

fn main() {
    let hash_set = HashSet::from([1, 2, 3, 4, 5]);
    println!("{:?}", hash_set)
}

Output:

{1, 4, 5, 3, 2}

2. HashSet 값 추가: insert()

insert(value)는 HashSet에 value를 추가합니다.

  • 이미 저장된 value를 추가 시, 추가되지 않습니다.
use std::collections::HashSet;

fn main() {
    let mut my_set = HashSet::new();
    my_set.insert("apple");
    my_set.insert("kiwi");
    my_set.insert("grape");
    my_set.insert("mango");

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

Output:

{"mango", "kiwi", "grape", "apple"}

3. HashSet 값 읽기/가져오기: get()

get(value)는 HashSet에서 value를 Option 객체로 가져옵니다.

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

fn main() {
    let mut my_set = HashSet::new();
    my_set.insert("apple");
    my_set.insert("kiwi");
    my_set.insert("grape");

    let ret = my_set.get("kiwi");
    println!("{:?}", ret);
}

Output:

Some("kiwi")

match를 사용하여 Optional에 저장된 value를 가져올 수 있습니다. value가 없을 수 있기 때문에 Some과 None에 대한 처리가 필요합니다.

use std::collections::HashSet;

fn main() {
    let mut my_set = HashSet::new();
    my_set.insert("apple");
    my_set.insert("kiwi");
    my_set.insert("grape");

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

Output:

Found value: kiwi

아래와 같이 좀 더 간결한 코드로 match 구문을 작성할 수 있습니다.

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

4. HashSet에서 value 제거: remove()

remove(value)는 HashSet에서 value를 제거합니다.

use std::collections::HashSet;

fn main() {
    let mut my_set = HashSet::new();
    my_set.insert("apple");
    my_set.insert("kiwi");
    my_set.insert("grape");
    println!("{:?}", my_set);

    // kiwi 제거 후 확인
    my_set.remove("kiwi");
    println!("{:?}", my_set);
}

Output:

{"apple", "kiwi", "grape"}
{"apple", "grape"}

5. HashSet의 모든 요소 순회

iter()는 HashSet에 저장된 모든 요소들을 참조하는 Iterator를 리턴합니다.

아래와 같이 HashSet의 모든 요소를 for문으로 순회할 수 있습니다.

use std::collections::HashSet;

fn main() {
    let mut my_set = HashSet::new();
    my_set.insert("apple");
    my_set.insert("kiwi");
    my_set.insert("grape");

    for fruit in my_set.iter() {
        println!("{}", fruit);
    }
}

Output:

apple
kiwi
grape

6. HashSet의 요소 개수/길이: len()

len()은 HashSet의 모든 요소 개수를 리턴합니다.

use std::collections::HashSet;

fn main() {
    let mut my_set = HashSet::new();
    my_set.insert("apple");
    my_set.insert("kiwi");
    my_set.insert("grape");

    println!("{}", my_set.len());
}

Output:

3

7. 특정 요소 포함 여부 확인: contains()

contains(value)는 HashSet에 특정 value가 포함되어있을 때 true를 리턴하며, 그렇지 않으면 false를 리턴합니다.

use std::collections::HashSet;

fn main() {
    let mut my_set = HashSet::new();
    my_set.insert("apple");
    my_set.insert("kiwi");
    my_set.insert("grape");

    if my_set.contains("kiwi") {
        println!("Has kiwi");
    }
}

Output:

Has kiwi
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha