📑

Rust で HashSet を使って値の重複をチェックする

2024/04/05に公開

はじめに

Rust を使っていて、連想配列、配列の値の重複を検知させたい!と思ったのがきっかけです。
Rust に限らずですが、連想配列や配列の重複チェックは実装する必要も出てくるかもしれませんので、
同じような境遇の方の救いになればと思います。

https://doc.rust-lang.org/std/collections/struct.HashSet.html

HashSet で重複を検知する

値のみの配列の場合

とある配列の要素1つ1つに対して重複チェックをします。

use std::collections::HashSet;

fn main() {
    let array = vec![1, 2, 3, 1, 4, 5, 2];

    let mut seen_values = HashSet::new();

    for &item in &array {
        if !seen_values.insert(item) {
            println!("重複しています: {:?}", item);
        } else {
            println!("重複していません: {:?}", item)
        }
    }
}

cargo runを実行すると、以下のように出力されます。

重複していません: 1
重複していません: 2
重複していません: 3
重複しています: 1
重複していません: 4
重複していません: 5
重複しています: 2

キーと値の配列の配列

ここでは、仮の Users 構造体を作り、その配列を作っています。

HashSet::new()でハッシュオブジェクトを生成することができ、
insertメソッドでハッシュオブジェクトに値を挿入します。
insertは重複した値をオブジェクトに入れることができないので、検知することができます。

use std::collections::HashSet;

#[derive(Debug)]
struct User {
    name: String,
    age: u32,
}

fn main() {
    let users = vec![
        User {
            name: "Alice".to_string(),
            age: 20,
        },
        User {
            name: "Bob".to_string(),
            age: 30,
        },
        User {
            name: "Mike".to_string(),
            age: 20,
        },
    ];

    let mut seen_keys = HashSet::new();

    for user in &users {
        if !seen_keys.insert(&user.age) {
            println!("重複しています: {:?}", user);
        } else {
            println!("重複していません: {:?}", user);
        }
    }
}

cargo runを実行すると以下のように出力されます。

重複していません: User { name: "Alice", age: 20 }
重複していません: User { name: "Bob", age: 30 }
重複しています: User { name: "Mike", age: 20 }

おわりに

意外にも簡単に実装することが出来ました。HashSetはとても便利ですね!

それではまた。Cheers!

コラボスタイル Developers

Discussion