マップの使用
マップは、名前と値のペアの順序付けされていないコレクションです。 各名前/値ペアの名前は、後からマップの値を検索する鍵であるため、そのエントリのマップのキーと呼ばれます。
Groovyの四角カッコ表記を使用して、各キーと値を区切るコロンを使用し、次のような各キーと値のペア間にカンマを使用してマップを作成できます:
// Define a map of name/value pairs that associate
// a status value (e.g. "Open", "Closed", "Pending") with a
// maximum number of days
def maxDaysByStatus = [Open:30, Closed:90, Pending:45]
デフォルトでは、マップ・キーは文字列とみなされるため、キー値を引用符で囲む必要はありません。 ただし、キー値にスペースが含まれている場合は、次のように引用符で囲む必要があります:
def maxDaysByStatus = [Open:30, Closed:90, Pending:45, 'On Backorder':10]
マップ・キーとして別のタイプを使用する場合は、キーをカッコで囲む必要があります。 カッコを含まない次の例を考えてみます:
def x = 1
def y = 2
def xvalue = 'One'
def yvalue = 'Two'
// this creates a map with entries ('x'->'One') and ('y'->'Two')
def m = [x:xvalue,y:yvalue]
前述の例では、変数x
の値および変数y
の値をマップ・キーとして使用するのではなく、文字列x
およびy
のキー値を使用してマップを作成します。 この効果を得るには、キー式を次のようにカッコで囲みます:
def x = 1
def y = 2
def xvalue = 'One'
def yvalue = 'Two'
// this creates a map with entries (1->'One') and (2->'Two')
def m = [(x):xvalue,(y):yvalue]
これにより、数値1
および2
のキー値を含むマップが作成されます。
マップ・エントリの値を参照するには、Mayキー値をマップ・オブジェクトのフィールド名であるかのように使用して、次のようなドット表記を使用します:
def closedDayLimit = maxDaysByStatus.Closed
キー値にリテラル・ドット文字が含まれているか、空白または特殊文字が含まれている場合は、キー値をオペランドとして渡して、角カッコ表記法を使用することもできます:
def onBackorderDayLimit = maxDaysByStatus['On Backorder']
キー値がリテラル文字列ではなく変数の値から取得される場合、この大カッコ表記も便利です。次に例を示します:
// Loop over a list of statuses to process
for (curStatus in ['Open','On Backorder']) {
def limitForCurStatus = maxDaysByStatus[curStatus]
// do something here with the current status' limit
}
マップに新しいキー/バリュー・ペアを追加するには、put()
メソッドを使用します:
// Add an additional status to the map
maxDaysByStatus.put('Ringo')
マップに重複するキー・エントリを含めることはできないため、put()
を使用して既存の要素の値を入れると、そのキーの既存の値が上書きされます。 containsKey()
関数を使用して、特定のキー値を持つ特定のマップ・エントリがすでに存在するかどうかをテストしたり、containsValue()
関数を使用して、特定の値を持つマップ・エントリが存在するかどうかをテストできます - 0、1、または複数のエントリが存在する可能性があります。
// Test whether a map key matching the value of the
// curKey variable exists or not
if (maxDaysByStatus.containsKey(curKey)) {
def dayLimit = maxDaysByStatus[curKey]
// do something with dayLimit here
}
else {
println("Unexpected error: key ${curKey} not found in maxDaysByStatusMap!")
}
マップからエントリを削除するには、remove()
メソッドを使用します。 以前に渡されたキーに関連付けられていた値が返されます。そうしないと、削除するマップに指定されたキー値が見つからない場合はnullが返されます。
maxDaysByStatus.remove('On Backorder')
空のマップは、次のようにコロンのみで囲まれた角括弧表記を使用して定義できます:
def foundItemCounts = [:] // empty map!