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