値のグループ化
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 16/56。
default-subscriptパターンは、2つの日常的な形状の基礎となります。
頻度カウンター: 各キーが何回出現するかをカウントします。
let letters = ["a", "b", "a", "c", "a"]
var counts: [String: Int] = [:]
for letter in letters {
counts[letter, default: 0] += 1
}
// counts == ["a": 3, "b": 1, "c": 1]バケッティング (Bucketing): 派生したキーに基づいて値を収集します:
let words = ["hi", "hello", "yo", "hey"]
var byLength: [Int: [String]] = [:]
for w in words {
byLength[w.count, default: []].append(w)
}
// [2: ["hi", "yo"], 5: ["hello"], 3: ["hey"]]バケット化(bucketing)のケースにおけるデフォルトは空の配列です。default: の値は、キーが存在しない場合にのみ使用され、その後、右辺がそのエントリをその場で変更します。
チャレンジ
中級入力の1行を読み込みます。これはカンマ区切りの単語リストです。
以下の順序で出力してください:
- 入力に現れる単語の長さごとに1行ずつ、短い順にソートして、
<length>: <count>の形式で出力します。ここでcountはその長さの単語がいくつ現れたかを示します。 Most common length: <n>。ここでnは最もカウントが多い長さです。同じカウントの場合は、より短い長さを選択してください。
入力がhi,hello,yo,hey,bonjour,byeの場合、出力は以下のようになります:
2: 2
3: 2
5: 1
7: 1
Most common length: 2(長さ2と3はどちらも2回現れます。タイブレークでは短い方が優先されるため、2となります。)
チートシート
頻度カウンター – default: 0 を使用して各キーの出現回数をカウントします:
var counts: [String: Int] = [:]
for letter in letters {
counts[letter, default: 0] += 1
}バケッティング – default: [] を使用して、派生したキーの下に値をグループ化します:
var byLength: [Int: [String]] = [:]
for w in words {
byLength[w.count, default: []].append(w)
}default: 値はキーが存在しない場合にのみ使用されます。その後、結果はその場で変更されます。
自分で試してみよう
let words = readLine()!.components(separatedBy: ",")
// TODO: 長さごとの単語数をカウントする。ソートして表示する。最も頻度の高いものを表示する(同数の場合は短い方を優先)。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。