2013-12-09 11 views
5

Desidero aggiornare i valori nella mappa in Groovy riempiendo determinati criteri. Ecco il mio codice:Aggiorna mappa utilizzando findAll e singolarmente in

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

Ma il risultato è il seguente:

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

Esiste un modo per farlo utilizzando sia findAll e ciascuno? O devo usare

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

risposta

8

la causa principale è findAll restituisce un nuova mappa istanza.

Quindi si potrebbe provare:

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

uscita è

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

In ogni caso, i valori si sono iterazione con l'each sono le voci della mappa con un puntatore a chiave e valore. Quando imposti it.value non stai sostituendo ciò che è nella mappa. Si sta solo aggiornando il puntatore nella voce della mappa. Per impostare in realtà il valore, è necessario effettuare le seguenti operazioni:

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

Sì, è corretto troppo, tuttavia non v'è più grande complessità: O (n^2) – kazik1616

+0

In realtà in questo caso è solo O (2n). Il 'findAll' prenderà n passi e nel peggiore dei casi, il' each' seguirà anche n passi. –

+0

Sostituire 'it.value' funziona. Pubblico la mia risposta –

Problemi correlati