2013-12-09 9 views
5

Ich möchte Werte in der Karte in Groovy aktualisieren bestimmte Kriterien erfüllen. Hier ist mein Code:Update Karte mit findAll und jeder in groovy

def m = [:] 
m['a'] = 1 
m['b'] = 2 
m['d'] = 3 
m.findAll { it.value > 1}.each { 
it.value = 4 
} 
println m 

Aber das Ergebnis ist folgende:

[a:1, b:2, d:3] 

Gibt es eine Möglichkeit, es zu tun beide findAll und jeder mit? Oder ich

m.each {if (it.value>1) it.value=4} 

Antwort

8

Die Ursache ist findAll gibt eine neue Map-Instanz.

Sie könnten also versuchen:

newMap = m.findAll { it.value > 1}.each { 
    it.value = 4 
} 
println m  //No change 
println newMap //This is what you need! 

Ausgang ist

[a:1, b:2, d:3] 
[b:4, d:4] 
4

In jedem Fall verwenden müssen, die Werte, die Sie mit dem each iterieren sind Map-Einträge mit einem Zeiger auf Schlüssel und Wert. Wenn Sie it.value festlegen, ersetzen Sie nicht, was in der Karte ist. Sie aktualisieren nur den Zeiger im Karteneintrag. Um tatsächlich den Wert eingestellt, müssen Sie Folgendes tun:

m.findAll { it.value > 1 }.each { m[it.key] = 4 } 
+0

Yep, das ist zu richtig, jedoch gibt es größere Komplexität: O (n^2) – kazik1616

+0

Eigentlich ist es in diesem Fall nur O (2n). Das 'findAll' wird n Schritte machen und im schlimmsten Fall wird das' each' auch n Schritte dauern. –

+0

Das Ersetzen von 'it.value' funktioniert. Ich poste meine Antwort. –