Groovyの地図

  • link:/category/programming/ [プログラミング]

  • Groovy

1. 概要

link:/groovy-language[Groovy] link:/category/javaの_https://www.baeldung.com/java-collections [Map] _ AP​​Iを拡張/ [Java]は、*フィルタリング、検索、ソートなどの操作のメソッドを提供します*。 また、マップを作成および操作するさまざまな速記方法も提供します。*
この記事では、Groovyがマップを操作する方法を見ていきます。

2. Groovy Mapsを作成する

*マップを作成するには、マップリテラル構文_ [k:v] _を使用できます。*基本的に、マップをインスタンス化し、1行でエントリを定義できます。
空のマップは、次を使用して作成できます。
def emptyMap = [:]
同様に、値を含むマップは、次を使用してインスタンス化できます。
def map = [name: "Jerry", age: 42, city: "New York"]
*キーは引用符で囲まれていないことに注意してください。*
*そしてデフォルトでは、Groovyはlink:/java-linked-hashmap[_java.util.LinkedHashMap_]のインスタンスを作成します。* _as_演算子を使用して、このデフォルトの動作をオーバーライドできます。

3. アイテムを追加する

地図を定義することから始めましょう:
def map = [name:"Jerry"]
マップにキーを追加できます。
map["age"] = 42
しかし、Javascriptに似たもう1つの方法は、プロパティ表記(ドット演算子)を使用することです。
map.city = "New York"
*つまり、Groovyは、Beanのような方法でキーと値のペアへのアクセスをサポートします。*
マップに新しいアイテムを追加する際に、リテラルの代わりに変数をキーとして使用することもできます。
def hobbyLiteral = "hobby"
def hobbyMap = [(hobbyLiteral): "Singing"]
map.putAll(hobbyMap)
assertTrue(hobbyMap.hobby == "Singing")
assertTrue(hobbyMap[hobbyLiteral] == "Singing")
最初に、キー_hobby._を格納する新しい変数を作成する必要があります。次に、括弧で囲まれたこの変数をマップリテラル構文で使用して、別のマップを作成します。

4. アイテムの取得

*リテラル構文またはプロパティ表記を使用して、マップからアイテムを取得できます。*
次のように定義されたマップの場合:
def map = [name:"Jerry", age: 42, city: "New York", hobby:"Singing"]
キー_name_に対応する値を取得できます。
assertTrue(map["name"] == "Jerry")
or
assertTrue(map.name == "Jerry")

5. アイテムを削除する

_remove()_メソッドを使用して、キーに基づいてマップからエントリを削除できます。 ただし、*マップから複数のエントリを削除する必要がある場合があります。 これは、_minus()_メソッドを使用して実行できます。*
_minus()_メソッドは_Map_を受け入れます。 そして、基礎となるマップから指定されたマップのすべてのエントリを削除した後、新しい_Map_を返します。
def map = [1:20, a:30, 2:42, 4:34, ba:67, 6:39, 7:49]

def minusMap = map.minus([2:42, 4:34]);
assertTrue(minusMap == [1:20, a:30, ba:67, 6:39, 7:49])
次に、条件に基づいてエントリを削除することもできます。 これは、_removeAll()_メソッドを使用して実現できます。
minusMap.removeAll{it -> it.key instanceof String}
assertTrue(minusMap == [1:20, 6:39, 7:49])
逆に、条件を満たすすべてのエントリを保持するには、_retainAll()_メソッドを使用できます。
minusMap.retainAll{it -> it.value % 2 == 0}
assertTrue(minusMap == [1:20])

6. エントリを反復処理する

  • each() および_eachWithIndex()_メソッドを使用してlink:/groovy-map-iterating [エントリを反復処理]することができます。

  • each()_メソッドは、現在の_Entry_に対応する_entry _、 key_、_value_などの暗黙的なパラメーターを提供します。*

    _eachWithIndex()_メソッドは、_Entry_に加えてインデックスも提供します。 どちらのメソッドも、引数としてlink:/groovy-closures[_Closure_]を受け入れます。
    次の例では、各_Entry._を反復処理します。_Closure_は_each()_メソッドに渡され、暗黙的なパラメーターエントリからキーと値のペアを取得して出力します。
map.each{entry -> println "$entry.key: $entry.value"}
次に、_eachWithIndex()_メソッドを使用して、現在のインデックスを他の値とともに印刷します。
map.eachWithIndex{entry, i -> println "$i $entry.key: $entry.value"}
_key _、_ value、_、およびindexを個別に指定することもできます。
map.eachWithIndex{key, value, i -> println "$i $key: $value"}

7. フィルタリング

  • _find()、findAll()_および_grep()_メソッドを使用して、キーと値に基づいてマップエントリをフィルタリングおよび検索できます。*

    これらのメソッドを実行するマップを定義することから始めましょう:
def map = [name:"Jerry", age: 42, city: "New York", hobby:"Singing"]
まず、_Closure_を受け入れ、_Closure_条件に一致する最初の_Entry_を返す_find()_メソッドを調べます。
assertTrue(map.find{it.value == "New York"}.key == "city")
同様に、_findAll_は_Closure_も受け入れますが、_Closure_の条件を満たすすべてのキーと値のペアを含む_Map_を返します。
assertTrue(map.findAll{it.value == "New York"} == [city : "New York"])
ただし、_List、_を使用する場合は、_findAll_の代わりに_grep_を使用できます。
map.grep{it.value == "New York"}.each{it -> assertTrue(it.key == "city" && it.value == "New York")}
最初にgrepを使用して、New Yorkという値を持つエントリを見つけました。 次に、戻り値の型が_Listであることを示すために、_grep()._の結果を反復処理します。そして、暗黙的なパラメーターで使用可能なリスト内の各_Entry_について、期待される結果かどうかを確認します。
次に、マップ内のすべてのアイテムが条件を満たすかどうかを確認するために、_boolean_を返す_every_を使用できます。
マップ内のすべての値が_String_型であるかどうかを確認しましょう。
assertTrue(map.every{it -> it.value instanceof String} == false)
同様に、_any_を使用して、マップ内のアイテムが条件に一致するかどうかを判断できます。
assertTrue(map.any{it -> it.value instanceof String} == true)

8. 変換と収集

マップのエントリを新しい値に変換したい場合があります。 * _collect()_および_collectEntries()_メソッドを使用すると、エントリをそれぞれ_Collection_または_Map_に変換および収集できます。*
いくつかの例を見てみましょう。
従業員IDと従業員のマップが与えられた場合:
def map = [
  1: [name:"Jerry", age: 42, city: "New York"],
  2: [name:"Long", age: 25, city: "New York"],
  3: [name:"Dustin", age: 29, city: "New York"],
  4: [name:"Dustin", age: 34, city: "New York"]]
_collect()_を使用して、すべての従業員の名前をリストに収集できます。
def names = map.collect{entry -> entry.value.name}
assertTrue(names == ["Jerry", "Long", "Dustin", "Dustin"])
次に、一意の名前のセットに関心がある場合は、_Collection_オブジェクトを渡すことでコレクションを指定できます。
def uniqueNames = map.collect([] as HashSet){entry -> entry.value.name}
assertTrue(uniqueNames == ["Jerry", "Long", "Dustin"] as Set)
マップ内の従業員名を小文字から大文字に変更する場合は、_collectEntries_を使用できます。 このメソッドは、変換された値のマップを返します。
def idNames = map.collectEntries{key, value -> [key, value.name]}
assertTrue(idNames == [1:"Jerry", 2:"Long", 3:"Dustin", 4:"Dustin"])
最後に、* _ collect_メソッドを_find_および_findAll_メソッドと組み合わせて使用​​して、フィルターされた結果を変換することもできます。
def below30Names = map.findAll{it.value.age < 30}.collect{key, value -> value.name}
assertTrue(below30Names == ["Long", "Dustin"])
ここでは、まず20〜30歳のすべての従業員を見つけ、それらを地図に収集します。

9. グルーピング

条件に基づいて、マップの一部のアイテムをサブマップにグループ化したい場合があります。
  • _groupBy()_メソッドは、マップのマップを返します。 また、各マップには、指定された条件に対して同じ結果に評価されるキーと値のペアが含まれます。*

def map = [1:20, 2: 40, 3: 11, 4: 93]

def subMap = map.groupBy{it.value % 2}
assertTrue(subMap == [0:[1:20, 2:40], 1:[3:11, 4:93]])
*サブマップを作成する別の方法は、_subMap()_ *を使用することです。 _groupBy()_では、キーに基づくグループ化のみを許可するという意味で異なります。
def keySubMap = map.subMap([1,2])
assertTrue(keySubMap == [1:20, 2:40])
この場合、キー1と2のエントリは新しいマップで返され、他のすべてのエントリは破棄されます。

10. ソート

通常、ソート時には、キーまたは値、あるいはその両方に基づいてマップ内のエントリをソートすることができます。 Groovyは、この目的に使用できる_sort()_メソッドを提供します。
地図がある場合:
def map = [ab:20, a: 40, cb: 11, ba: 93]
キーでソートを行う必要がある場合は、自然順序付けに基づくno-args _sort()_メソッドを使用します。
def naturallyOrderedMap = map.sort()
assertTrue([a:40, ab:20, ba:93, cb:11] == naturallyOrderedMap)
または、_sort(Comparator)_メソッドを使用して比較ロジックを提供します。
def compSortedMap = map.sort({k1, k2 -> k1 <=> k2} as Comparator)
assertTrue([a:40, ab:20, ba:93, cb:11] == compSortedMap)
次に、*キーまたは値、あるいはその両方でソートするために、_sort()_ *に_Closure_条件を指定できます。
def cloSortedMap = map.sort({it1, it2 -> it1.value <=> it1.value})
assertTrue([cb:11, ab:20, a:40, ba:93] == cloSortedMap)

11. 結論

まず、Groovyで__Map__sを作成する方法を検討しました。 次に、アイテムをマップに追加、取得、および削除するさまざまな方法を検討しました。
後で、Groovyですぐに使用できる一般的な操作を実行する方法について説明しました。 フィルタリング、検索、変換、並べ替えが含まれます。
いつものように、記事に記載されている例はhttps://github.com/eugenp/tutorials/tree/master/core-groovy-collections[GitHub。]にあります。