Wie überprüfe ich, ob ein Element in einem groovigen Array / Hash / Collection / List enthalten ist?

127

Wie finde ich heraus, ob ein Array ein Element enthält? Ich dachte, es könnte so etwas geben, [1, 2, 3].includes(1)das als bewertet wird true.

banderson623
quelle
Können Sie den Index auch herausfinden, wo sich dieses gleiche Element in der Liste befindet?
Atharva Johri
2
@ AtharvaJohriassert [12,42,33].indexOf(42) == 1
Riggs

Antworten:

138

.contains () ist die beste Methode für Listen, aber für Karten müssen Sie .containsKey () oder .containsValue () verwenden.

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')
Shemnon
quelle
Um zu überprüfen, ob eine Map unter einem bestimmten Schlüssel einen Wert ungleich Null enthält, reicht es aus, den folgenden Ausdruck zu überprüfen if(aMap["aKey"]==aValue).
Naeel Maqsudov
245

Etwas Syntaxzucker

1 in [1,2,3]
darannan
quelle
32
Vorsichtig. def m = [a: true]; 'a' in m→ wahr noch def m = [a: false]; 'a' in mfalsch → falsch!
Jesse Glick
55

Verwenden Sie für Listen contains:

[1,2,3].contains(1) == true
banderson623
quelle
16
Wahrscheinlich wollten Sie [1,2,3] sagen. Enthält (1). Da ich vermute, enthält die Funktion selbst bereits einen Booleschen Wert. Warum möchten Sie es noch einmal mit einem fest codierten "wahren" vergleichen?
Harshay Buradkar
6
@ HarshayBuradkar Um wirklich sicher zu gehen true == true, natürlich #joke
Automatico
8

Wenn Sie Ihre Includes-Methode wirklich in einer ArrayList haben möchten, fügen Sie sie einfach hinzu:

ArrayList.metaClass.includes = { i -> i in delegate }
John Flinchbaugh
quelle
3

WICHTIG Gotcha für die Verwendung von .contains () für eine Sammlung von Objekten, z. B. Domains. Wenn die Domain-Deklaration einen EqualsAndHashCode oder eine andere equals () -Implementierung enthält, um festzustellen, ob diese Ojbects gleich sind, und Sie sie wie folgt festgelegt haben ...

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

Dann wertet die .contains (myObjectToCompareTo) die Daten in myObjectToCompareTo mit den Daten für jede Objektinstanz in der Sammlung aus. Wenn Ihre Equals-Methode nicht dem Schnupftabak entspricht, wie meine nicht, werden möglicherweise unerwartete Ergebnisse angezeigt.

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

Ich habe es so gemacht, damit es funktioniert, wenn jemand danach sucht.

HinataXV
quelle
0

Sie können auch Übereinstimmungen mit regulären Ausdrücken wie folgt verwenden:

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
ninj
quelle