Rust で 2つのセットの差を計算する

Nilesh Katuwal 2023年6月21日
  1. Rustのハッシュセット
  2. Rust で 2つのセットの差を計算する
Rust で 2つのセットの差を計算する

この記事では、2つのセットの差を計算する組み込み関数について説明します。

Rustのハッシュセット

ハッシュセットは、値が () である HashMap として実装されます。 型と同様に、HashSet の要素は Eq および Hash トレイトを実装する必要があります。

通常、これは #[derive(PartialEq, Eq, hash)] で実現できます。 ただし、これらを独自に実装する場合は、次の特性が保持されている必要があります。

構文:

let mut HashSet_name= HashSet::new();

2つのキーが等しいかどうかを知る必要があります。 それらのハッシュも等しくなければなりません。

例:

fn main() {
use std::collections::HashSet;
let mut foods = HashSet::new();
foods.insert("I love to eat".to_string());
foods.insert("Ramen with cheese".to_string());
foods.insert("Ramen with eggs".to_string());
foods.insert("Ramen with seaweed".to_string());

if !foods.contains("Sesame") {
    println!("We have {} foods, but sesame is not the one I wanted.",
             foods.len());
}
foods.remove("Ramen with eggs.");

for food in &foods {
    println!("{food}");
}
}

出力:

We have 4 foods, but sesame is not the one I wanted.
Ramen with cheese
Ramen with seaweed
Ramen with eggs
I love to eat

HashSet に値を挿入すると (つまり、新しい値は既存の値と同一で、両方とも同じハッシュを持つ)、古い値が新しい値に置き換えられます。

セットには 4つの基本的な操作があります (後続の各呼び出しは反復子を返します)。

  1. union - 両方のセットからすべての異なる要素を取得します。
  2. difference - 2 番目のセットがない最初のセットからすべての要素を取得します。
  3. intersection - 両方のセットの一意の要素をすべて取得します。
  4. 対称差分 - 両方ではなくいずれかのセットのすべての要素を取得します。

以下は、セット間の違いを見つけるための例です。 違いが対称的ではないことを知る必要があります。

fn main() {
use std::collections::HashSet;
let x = HashSet::from([1, 2, 3]);
let y = HashSet::from([4, 2, 3, 4]);

for z in x.difference(&y) {
    println!("{z}");
}

let diff: HashSet<_> = x.difference(&y).collect();
assert_eq!(diff, [1].iter().collect());

let diff: HashSet<_> = y.difference(&x).collect();
assert_eq!(diff, [4].iter().collect());
}

出力:

1

Rust で 2つのセットの差を計算する

このプログラムは、2つの HashSets を作成して整数要素を格納し、2つのセットの違いを見つけて、結果を表示します。 これら 2つの HashSets は、次のソース コードで整数要素を格納できます。

2つのセットの違いは、difference() テクニックを使用して決定されました。 次に、結果を印刷しました。

use std::collections::HashSet;

fn main() {
    let first_set: HashSet<_> = [10, 20, 30, 40].iter().cloned().collect();
    let second_set: HashSet<_> = [10, 20, 30].iter().cloned().collect();

    println!("The difference betwen first_set and second_set is:");
    for d in first_set.difference(&second_set) {
        print!("{} ", d);
    }
}

出力:

The difference betwen first_set and second_set is:
40