このページの内容

マップ

マップは連想コレクションです。キーを値に対応付けるエントリーの集まりを格納します。同じデータ構造には、ほかの言語でハッシュテーブル、辞書、連想配列、テーブルなど、さまざまな名前が付いています。

コンマで区切った一連のエントリーを波括弧で囲むと、マップを作成できます。各エントリーは、コロンで区切ったキーと値です。


{
  "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])
}



メソッド呼び出し →← リスト