Jak sprawdzić, czy element w groovy array / hash / collection / list?

127

Jak sprawdzić, czy tablica zawiera element? Pomyślałem, że może istnieć coś takiego, [1, 2, 3].includes(1)co można ocenić jako true.

banderson623
źródło
Czy możesz znaleźć indeks również, gdzie ten równy element znajduje się na liście?
Atharva Johri
2
@AtharvaJohriassert [12,42,33].indexOf(42) == 1
Riggs

Odpowiedzi:

138

.contains () jest najlepszą metodą w przypadku list, ale w przypadku map należy użyć .containsKey () lub .containsValue ()

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')
shemnon
źródło
Ponadto, aby sprawdzić, czy mapa zawiera jakąś inną wartość niż null pod określonym kluczem, wystarczy sprawdzić następujące wyrażenie if(aMap["aKey"]==aValue).
Naeel Maqsudov,
245

Trochę cukru składniowego

1 in [1,2,3]
dahernan
źródło
32
Ostrożny. def m = [a: true]; 'a' in m→ prawda, ale def m = [a: false]; 'a' in m→ fałsz!
Jesse Glick
55

W przypadku list użyj contains:

[1,2,3].contains(1) == true
banderson623
źródło
16
Prawdopodobnie chciałeś powiedzieć [1,2,3] .contains (1). Ponieważ zgaduję, że sama funkcja już zwraca wartość logiczną. Dlaczego chcesz ponownie porównać to z zakodowanym na stałe „prawdą”.
Harshay Buradkar
6
@HarshayBuradkar Aby się upewnić true == true, oczywiście # żart
Automatico
8

Jeśli naprawdę chcesz, aby Twoja metoda zawierała się w ArrayList, po prostu ją dodaj:

ArrayList.metaClass.includes = { i -> i in delegate }
John Flinchbaugh
źródło
3

WAŻNE Gotcha do używania .contains () w kolekcji obiektów, takich jak domeny. Jeśli deklaracja domeny zawiera EqualsAndHashCode lub inną implementację equals () w celu określenia, czy te Ojbects są równe, i ustawiłeś to w ten sposób ...

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

następnie .contains (myObjectToCompareTo) oceni dane w myObjectToCompareTo z danymi dla każdej instancji Object w kolekcji. Tak więc, jeśli twoja metoda równych sobie nie pasuje do tabaki, tak jak moja nie, możesz zobaczyć nieoczekiwane rezultaty.

Dwanaście24
źródło
2
def fruitBag = ["orange","banana","coconut"]
def fruit = fruitBag.collect{item -> item.contains('n')}

Zrobiłem to w ten sposób, więc działa, jeśli ktoś tego szuka.

HinataXV
źródło
0

Możesz również użyć dopasowań z wyrażeniami regularnymi, takimi jak to:

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
ninj
źródło