値の更新
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 32/66。
ハッシュマップの値をさまざまな方法で更新する必要がある場合があります。.insert() が既存の値を上書きすることはすでに学びましたが、キーがまだ存在しない場合にのみ値を追加したい場合はどうすればよいでしょうか?
Rustは、より高度な値の更新のために.entry() APIを提供しています。このAPIで最も便利なメソッドは.or_insert()で、これはキーがまだ存在しない場合にのみ値を挿入します:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// これはAliceのスコアを上書きしません
scores.entry("Alice").or_insert(90);
// Bobはマップに存在しないため、これはBobのスコアを追加します
scores.entry("Bob").or_insert(90);.entry()メソッドは、ハッシュマップ内の占有されている場所、または空いている場所のいずれかを表すEntry列挙型を返します。これに対して.or_insert()を呼び出すと、エントリが空の場合(キーが存在しない場合)にのみ、新しい値を挿入します。
チャレンジ
簡単処理するプレイヤー名の数を示す整数 n を受け取ります。次に、入力として n 個のプレイヤー名を受け取ります。プレイヤーのスコアを追跡するためのハッシュマップ(型 HashMap<String, i32>)を作成してください。受け取った各プレイヤー名に対して、.entry() と .or_insert() を使用して、まだ存在しない場合にのみ初期スコア 100 でマップに追加します。すべての名前を処理した後、各プレイヤーとそのスコアを出力してください。
要件:
std::collectionsからHashMapをインポートする- 型
HashMap<String, i32>のミュータブルなハッシュマップを作成する - 最初の入力を読み取り、それを
i32に変換してプレイヤー名の数を取得する - ループを使用して
n個のプレイヤー名を読み取る - 各プレイヤー名について、
.entry(name).or_insert(100)を使用して、マップにまだ存在しない場合にスコア100で追加する - すべての名前を処理した後、ハッシュマップを反復処理し、各プレイヤーの情報を
[name]: [score]の形式で出力する
入力:
- 1行目: 整数
n(例:5) - 続く
n行: プレイヤー名 (例:Alice,Bob,Alice,Charlie,Bob)
出力:
- ユニークなプレイヤーごとに1行、
[name]: [score]の形式で出力 - 出力行の順序はテスト実行ごとに異なる場合があります
チートシート
.entry() APIは、ハッシュマップの値を更新するための洗練された方法を提供します。.or_insert()メソッドは、キーがまだ存在しない場合にのみ値を挿入します:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// This will NOT overwrite Alice's score
scores.entry("Alice").or_insert(90);
// This WILL add Bob's score since he's not in the map
scores.entry("Bob").or_insert(90);.entry()メソッドは、ハッシュマップ内の占有されているか空いているかのいずれかの場所を表すEntry列挙型を返します。.or_insert()を呼び出すと、エントリが空(キーが存在しない)の場合にのみ新しい値を挿入します。
自分で試してみよう
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// プレイヤー名の数を読み込む
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// プレイヤースコアを格納するための可変HashMapを作成する
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: 以下にコードを記述してください
// n個のプレイヤー名を読み込み、.entry().or_insert(100) を使用してマップに追加します
// 各プレイヤーとそのスコアを次の形式で出力します: [name]: [score]
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。