値のグループ化
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]バケット化:導出されたキーの下に値をまとめます:
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"]]バケット化の場合のデフォルト値は空の配列です。default: の値はキーが存在しない場合にのみ使用され、その後、右辺によってエントリがその場で変更されます。
チャレンジ
中級入力を1行読み取ります。カンマ区切りの単語のリストです。
次の順序で出力します。
- 入力に現れる単語の長さごとに1行ずつ、短い順に並べ、
<length>: <count>の形式で出力します。ここでcountは、その長さの単語が何個現れたかを表します。 Most common length: <n>を出力します。nはcountが最も多い長さです。同数の場合は短い長さを選びます。
入力がhi,hello,yo,hey,bonjour,byeの場合、出力は次のようになります。
2: 2
3: 2
5: 1
7: 1
Most common length: 2(長さ2と3はいずれも2回現れます。短い方を選ぶため、2が選ばれます。)
自分で試してみよう
let words = readLine()!.components(separatedBy: ",")
// TODO: 長さごとの単語数を数え、ソートして出力し、最も多いものを出力する(同点の場合は短い方)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド