Come verificare se l'elemento in groovy array / hash / collection / list?


127

Come faccio a capire se un array contiene un elemento? Ho pensato che potrebbe esserci qualcosa del genere [1, 2, 3].includes(1)che valuterebbe come true.


Riesci a trovare l'indice anche di dove si trova questo elemento uguale nell'elenco?
Atharva Johri,

2
@AtharvaJohriassert [12,42,33].indexOf(42) == 1
Riggs

Risposte:


138

.contains () è il metodo migliore per gli elenchi, ma per le mappe dovrai usare .containsKey () o .containsValue ()

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')

Inoltre, per verificare se una mappa contiene un valore non nullo in una determinata chiave, è sufficiente controllare la seguente espressione if(aMap["aKey"]==aValue).
Naeel Maqsudov,

245

Qualche zucchero di sintassi

1 in [1,2,3]

32
Attento. def m = [a: true]; 'a' in m→ ancora vero def m = [a: false]; 'a' in m→ falso!
Jesse Glick,

55

Per gli elenchi, utilizzare contains:

[1,2,3].contains(1) == true

16
Probabilmente avresti voluto dire [1,2,3] .contains (1). Perché suppongo che contiene la funzione stessa restituisce già un valore booleano. Perché vuoi confrontarlo di nuovo con un 'vero' hardcoded.
Harshay Buradkar,

6
@HarshayBuradkar Per essere veramente sicuri true == true, ovviamente #joke
Automatico

8

Se vuoi davvero il tuo metodo include su un ArrayList, basta aggiungerlo:

ArrayList.metaClass.includes = { i -> i in delegate }

3

IMPORTANTE Gotcha per l'utilizzo di .contains () su una raccolta di oggetti, ad esempio domini. Se la dichiarazione del dominio contiene un EqualsAndHashCode o qualche altra implementazione equals () per determinare se quegli Ojbect sono uguali e l'hai impostato in questo modo ...

import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode(includes = "settingNameId, value")

quindi .contains (myObjectToCompareTo) valuterà i dati in myObjectToCompareTo con i dati per ciascuna istanza di oggetto nella raccolta. Quindi, se il tuo metodo uguale non è all'altezza, come il mio no, potresti vedere risultati inaspettati.


2
def fruitBag = ["orange","banana","coconut"]
def fruit = fruitBag.collect{item -> item.contains('n')}

L'ho fatto così, quindi funziona se qualcuno lo sta cercando.



0

Puoi anche usare le corrispondenze con espressioni regolari in questo modo:

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.