マップ
マップは連想コレクションです。キーを値に対応付けるエントリーの集まりを格納します。同じデータ構造には、ほかの言語でハッシュテーブル、辞書、連想配列、テーブルなど、さまざまな名前が付いています。
コンマで区切った一連のエントリーを波括弧で囲むと、マップを作成できます。各エントリーは、コロンで区切ったキーと値です。
{
"maple": "Sugar Maple (Acer Saccharum)",
"larch": "Alpine Larch (Larix Lyallii)",
"oak": "Red Oak (Quercus Rubra)",
"fir": "Fraser Fir (Abies Fraseri)"
}
これは、木の種類(キー)を、その仲間の特定の木(値)に対応付けるマップを作成します。構文上、マップリテラルのキーには、任意のリテラル、変数名、丸括弧で囲んだ式を使えます。値には任意の式を使えます。この例では、キーと値の両方に文字列リテラルを使っています。
意味上は、値にどんなオブジェクトでも使え、複数のキーを同じ値に対応付けることもできます。
キーにはいくつかの制限があります。Wrenに組み込まれた不変の値型のいずれかでなければなりません。つまり、数値、文字列、範囲、真偽値、またはnullです。クラスオブジェクトもキーに使えます(そのクラスのインスタンスではなく、クラスそのものです)。
この制限がある理由、そしてほかの言語でマップを「ハッシュテーブル」と呼ぶ理由は、各キーから数値のハッシュコードを生成するためです。これにより、とても大きなマップでも、キーに対応する値を定数時間で見つけられます。Wrenは特定の組み込み型のハッシュ方法しか知らないので、キーに使えるのもそれらだけです。
エントリーの追加 #
新しいキーと値の組をマップに追加するには、添字演算子を使います。
var capitals = {}
capitals["Georgia"] = "Atlanta"
capitals["Idaho"] = "Boise"
capitals["Maine"] = "Augusta"
キーがまだ存在しなければ、そのキーを追加して指定した値に対応付けます。キーがすでに存在すれば、その値を置き換えるだけです。
値の検索 #
キーに対応する値を見つけるときも、おなじみの添字演算子を使います。
System.print(capitals["Idaho"]) //> Boise
キーが存在すれば、その値を返します。存在しなければ、nullを返します。もちろん、null自体も値として使えるため、ここでnullが得られても、必ずしもキーが見つからなかったとは限りません。
キーが存在するかを確実に調べるには、containsKey()を呼び出せます。
var capitals = {"Georgia": null}
System.print(capitals["Georgia"]) //> null (though key exists)
System.print(capitals["Idaho"]) //> null
System.print(capitals.containsKey("Georgia")) //> true
System.print(capitals.containsKey("Idaho")) //> false
countを使うと、マップに含まれるエントリーの数を確認できます。
System.print(capitals.count) //> 3
エントリーの削除 #
マップからエントリーを削除するには、remove()を呼び出し、削除したいエントリーのキーを渡します。
capitals.remove("Maine")
System.print(capitals.containsKey("Maine")) //> false
キーが見つかれば、それに対応していた値を返します。
System.print(capitals.remove("Georgia")) //> Atlanta
もともとマップにキーがなかった場合は、remove()はnullを返すだけです。
マップからすべてを削除したい場合は、リストと同様、clear()を呼び出します。
capitals.clear()
System.print(capitals.count) //> 0
内容の反復処理 #
探しているキーが分かっている場合、添字演算子は値を見つけるのに適しています。しかし、マップのすべての内容を見たいこともあります。通常のforループで内容を反復処理できます。また、マップは内容にアクセスするため、keysとvaluesという二つのメソッドも公開しています。
マップのkeysメソッドは、すべてのキーを反復処理するSequenceを返します。valuesメソッドは、値を反復処理するSequenceを返します。
どの方法で反復処理しても、その順序は定義されていません。Wrenは、キーや値をどの順番で反復するかを保証しません。保証するのは、すべてのエントリーがそれぞれ一度だけ現れることです。
for(entry in map)による反復処理forでマップを反復処理すると、keyフィールドとvalueフィールドを持つエントリーを受け取ります。これで、マップ内の各要素の情報が得られます。
var birds = {
"Arizona": "Cactus wren",
"Hawaii": "Nēnē",
"Ohio": "Northern Cardinal"
}
for (bird in birds) {
System.print("The state bird of %(bird.key) is %(bird.value)")
}
キーを使った反復処理
キーを反復処理し、それぞれのキーで値を検索することもできます。
var birds = {
"Arizona": "Cactus wren",
"Hawaii": "Nēnē",
"Ohio": "Northern Cardinal"
}
for (state in birds.keys) {
System.print("The state bird of %(state) is " + birds[state])
}
メソッド呼び出し →← リスト