カウントとグループ化
mapを使った一般的なパターンを学びます。
「カウントとグループ化」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
要素のカウント
コレクション内で各値が何回出現するかを数える処理は、非常によく行います。
値から出現回数へのHashMapが自然な選択です。キーが要素、値がその出現回数になります。
カウントのパターン
各要素について対応するスロットを検索し、なければ0を設定してから1を加えます。
entry APIを使えば、これを簡潔な1行で書けます。このパターンは、カウント可能なあらゆる要素に使えます。
use std::collections::HashMap;
fn main() {
let mut counts = HashMap::new();
for n in [1, 1, 2, 3, 3, 3] {
*counts.entry(n).or_insert(0) += 1;
}
println!("threes: {}", counts[&3]);
}文字のカウント
文字列は文字で構成されているため、文字の出現頻度も同じ方法で数えられます。
chars()で反復処理し、それぞれをmapに加算します。
use std::collections::HashMap;
fn main() {
let mut freq = HashMap::new();
for c in "banana".chars() {
*freq.entry(c).or_insert(0) += 1;
}
println!("a: {}, n: {}", freq[&'a'], freq[&'n']);
}単語のカウント
単語を数えるには、split_whitespaceで文を空白文字ごとに分割します。
分割された各要素がキーになります。これは、単純な単語頻度アナライザーの基礎です。
use std::collections::HashMap;
fn main() {
let text = "go go stop go";
let mut counts = HashMap::new();
for w in text.split_whitespace() {
*counts.entry(w).or_insert(0) += 1;
}
println!("go: {}", counts["go"]);
}最大カウントの検索
カウントが得られたら、反復処理しながら最大値を記録して、最も頻繁に現れる要素を見つけます。
各エントリのカウントを、それまでに見つかった最大値と比較できます。
use std::collections::HashMap;
fn main() {
let mut counts = HashMap::new();
for c in "aabbbc".chars() {
*counts.entry(c).or_insert(0) += 1;
}
let top = counts.iter().max_by_key(|(_, &v)| v).unwrap();
println!("most common: {}", top.0);
}要素のグループ化
グループ化とは、共通する性質を持つ要素をバケットにまとめることです。
グループのキーからメンバーのVecへのHashMapを使います。entry APIにより、初回使用時には空のベクターが設定されます。
use std::collections::HashMap;
fn main() {
let mut groups: HashMap<bool, Vec<i32>> = HashMap::new();
for n in 1..=6 {
groups.entry(n % 2 == 0).or_default().push(n);
}
println!("evens: {:?}", groups[&true]);
}先頭文字によるグループ化
単語の最初の文字は、自然なグループ化キーになります。
最初の文字を取り出し、各単語を対応するバケットに追加します。
use std::collections::HashMap;
fn main() {
let words = ["apple", "avocado", "banana"];
let mut by_letter: HashMap<char, Vec<&str>> = HashMap::new();
for w in words {
let first = w.chars().next().unwrap();
by_letter.entry(first).or_default().push(w);
}
println!("a-words: {}", by_letter[&'a'].len());
}長さによるグループ化
各単語の長さなど、計算で求めた任意の性質を基準にグループ化できます。
ここではキーが数値になり、各バケットに同じ長さの単語が集められます。
use std::collections::HashMap;
fn main() {
let words = ["hi", "yo", "hey", "hello"];
let mut by_len: HashMap<usize, Vec<&str>> = HashMap::new();
for w in words {
by_len.entry(w.len()).or_default().push(w);
}
println!("len 2: {}", by_len[&2].len());
}一意な要素のカウント
重複しない値の数を数えるには、集合とmapを組み合わせます。または、単純にHashSetに収集して、その長さを調べます。
これにより、重複を無視して何種類の要素が現れたかがわかります。
use std::collections::HashSet;
fn main() {
let visits = ["sam", "mia", "sam", "leo", "mia"];
let unique: HashSet<&str> = visits.iter().copied().collect();
println!("unique visitors: {}", unique.len());
}結果の出力
カウントやグループ化が終わったら、mapをループして結果を出力します。
順序は保証されないことに注意してください。出力順を固定したい場合は、先にキーをソートします。
use std::collections::HashMap;
fn main() {
let mut counts = HashMap::new();
for c in "abca".chars() {
*counts.entry(c).or_insert(0) += 1;
}
let mut keys: Vec<_> = counts.keys().collect();
keys.sort();
for k in keys {
println!("{}: {}", k, counts[k]);
}
}グループごとの合計
メンバーを集める代わりに、キーごとの値の合計など、集計を行うこともできます。
スロットがなければ0を設定し、カウントと同じように各要素の値を加算します。ただし、こちらは実際の数量を扱います。
use std::collections::HashMap;
fn main() {
let sales = [("a", 10), ("b", 5), ("a", 3)];
let mut totals: HashMap<&str, i32> = HashMap::new();
for (k, amount) in sales {
*totals.entry(k).or_insert(0) += amount;
}
println!("a total: {}", totals["a"]);
}クイックチェック
単語を先頭文字ごとのバケットにグループ化します。
まとめ
entryパターンを使って要素、文字、単語を数え、最も頻繁に現れる値を見つけました。
文字と長さを基準に要素をVecのバケットへグループ化し、HashSetで重複しない値の数も数えました。
よくある質問
「カウントとグループ化」レッスンは無料ですか?
はい。「カウントとグループ化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「カウントとグループ化」で何を学びますか?
mapを使った一般的なパターンを学びます。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「カウントとグループ化」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- HashMapを構築する
- Entry APIとデフォルト値
- HashSetを扱う
- カウントとグループ化