it-swarm.com.de

Karte mit Schlüssel als String und Wert als Liste in Groovy

Kann mir jemand auf ein Beispiel verweisen, wie eine Map in Groovy verwendet wird, die eine String als Schlüssel und eine List als Wert hat?

27
Sripaul

Groovy akzeptiert fast alle Java-Syntax. Es gibt also eine Reihe von Auswahlmöglichkeiten, wie unten dargestellt:

// Java syntax 

Map<String,List> map1  = new HashMap<>();
List list1 = new ArrayList();
list1.add("hello");
map1.put("abc", list1); 
assert map1.get("abc") == list1;

// slightly less Java-esque

def map2  = new HashMap<String,List>()
def list2 = new ArrayList()
list2.add("hello")
map2.put("abc", list2)
assert map2.get("abc") == list2

// typical Groovy

def map3  = [:]
def list3 = []
list3 << "hello"
map3.'abc'= list3
assert map3.'abc' == list3
37
Michael Easter
def map = [:]
map["stringKey"] = [1, 2, 3, 4]
map["anotherKey"] = [55, 66, 77]

assert map["anotherKey"] == [55, 66, 77] 
16
AA.

Ein weiteres kleines Stück, das beim Umgang mit Karten/Liste als Wert in einer Karte hilfreich ist, ist die withDefault(Closure)-Methode auf Karten in Groovy. Statt den folgenden Code auszuführen:

Map m = [:]
for(object in listOfObjects)
{
  if(m.containsKey(object.myKey))
  {
    m.get(object.myKey).add(object.myValue)
  }
  else
  {
    m.put(object.myKey, [object.myValue]
  }
}

Sie können Folgendes tun:

Map m = [:].withDefault{key -> return []}
for(object in listOfObjects)
{
  List valueList = m.get(object.myKey)
  m.put(object.myKey, valueList)
}

Mit default kann auch für andere Dinge verwendet werden, aber ich finde, dass dies der häufigste Anwendungsfall für mich ist.

API: http://www.groovy-lang.org/gdk.html

Karte -> withDefault (Schließung)

8
Joseph

sie müssen Map Groovy nicht intern deklarieren 

def personDetails = [firstName:'John', lastName:'Doe', fullName:'John Doe']

// print the values..
    println "First Name: ${personDetails.firstName}"
    println "Last Name: ${personDetails.lastName}"

http://grails.asia/groovy-map-tutorial

5

Joseph habe vergessen, den Wert in seinem Beispiel mit withDefault..__ hinzuzufügen.

Map map = [:].withDefault { key -> return [] }
listOfObjects.each { map.get(it.myKey).add(it.myValue) }
1
Johan Frick