0Pricing
Learn Rust Coding · レッスン

HashSetを扱う

一意な値を管理します。

「HashSetを扱う」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

HashSetとは

HashSetは、重複しない値のコレクションを格納します。キーはなく、重複もなく、メンバーだけが存在します。

「この値を以前に見たことがあるか」という問いに、高速に答えるのに適しています。

セットを作成する

HashMapと同じく、HashSetはstd::collectionsにあり、useでインポートする必要があります。

HashSet::new()で空のセットを作成し、要素を追加できるようにmutとして宣言します。

use std::collections::HashSet;

fn main() {
    let mut s: HashSet<i32> = HashSet::new();
    s.insert(1);
    s.insert(2);
    println!("size: {}", s.len());
}

挿入と重複

insertメソッドはboolを返します。値が新規ならtrue、すでに存在していればfalseです。

重複する値を挿入しても何も起こらないため、セット内の一意性は自動的に保たれます。

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    println!("{}", s.insert(5));
    println!("{}", s.insert(5));
    println!("len = {}", s.len());
}

メンバーシップを確認する

containsを使うと、値がセットに含まれているか確認できます。boolを返します。

セットを使う最も一般的な理由は、高速でわかりやすい検索を行えることです。

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    s.insert("red");
    s.insert("blue");
    println!("has red? {}", s.contains("red"));
    println!("has green? {}", s.contains("green"));
}

メンバーを削除する

removeメソッドは値を受け取り、その値が存在して削除された場合はtrueを返します。

存在しない値を削除しようとした場合は、単にfalseが返されます。

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    s.insert(7);
    println!("{}", s.remove(&7));
    println!("{}", s.remove(&7));
}

イテレータから作成する

値のイテレータは、直接HashSetにcollectできます。

重複を取り除く簡単な方法です。重複を含むリストを渡すと、セットは各値を1つずつだけ保持します。

use std::collections::HashSet;

fn main() {
    let nums = [1, 2, 2, 3, 3, 3];
    let unique: HashSet<i32> = nums.iter().copied().collect();
    println!("distinct: {}", unique.len());
}

セットをイテレートする

forループでセットを処理すると、各メンバーを順番に参照できます。

HashMapと同様に、イテレーションの順序は保証されず、実行するたびに異なる可能性があります。

use std::collections::HashSet;

fn main() {
    let s: HashSet<i32> = [10, 20, 30].into_iter().collect();
    let mut total = 0;
    for v in &s {
        total += v;
    }
    println!("sum = {}", total);
}

和集合

unionメソッドは、どちらか一方の集合に含まれるすべての値を返します。

これはイテレータを返すため、新しい集合に収集するか、ループで処理します。

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [3, 4].into_iter().collect();
    let u: HashSet<i32> = a.union(&b).copied().collect();
    println!("union size: {}", u.len());
}

共通部分

intersectionメソッドは、両方の集合に含まれる値を返します。

共有タグや共通の友人など、共通する要素を見つけるのに最適です。

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [2, 3, 4].into_iter().collect();
    let common: Vec<i32> = a.intersection(&b).copied().collect();
    println!("common count: {}", common.len());
}

差集合

differenceメソッドは、1つ目の集合には含まれるものの、2つ目の集合には含まれない値を返します。

順序を入れ替えると、反対方向の差集合を取得できます。また、どちらか一方の集合にだけ含まれる要素にはsymmetric_differenceも使えます。

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [2].into_iter().collect();
    let only_a: Vec<i32> = a.difference(&b).copied().collect();
    println!("only in a: {}", only_a.len());
}

部分集合と素集合

is_subsetを使うと、ある集合のすべての要素が別の集合に含まれているかを確認できます。

is_disjointを使うと、2つの集合に共通する値がまったくないことを確認できます。どちらも通常のboolを返します。

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2].into_iter().collect();
    let b: HashSet<i32> = [1, 2, 3].into_iter().collect();
    println!("a subset of b? {}", a.is_subset(&b));
}

クイックチェック

HashSetに同じ値を2回挿入します。

まとめ

HashSetは一意な値を保持し、高速なcontainsチェックを行えます。

値の挿入、削除、collectによる重複排除、さらにunion、intersection、differenceによる集合の結合を行いました。

よくある質問

「HashSetを扱う」レッスンは無料ですか?

はい。「HashSetを扱う」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「HashSetを扱う」で何を学びますか?

一意な値を管理します。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「HashSetを扱う」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. HashMapを構築する
  2. Entry APIとデフォルト値
  3. HashSetを扱う
  4. カウントとグループ化
← Learn Rust Codingに戻る