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.


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')

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]

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

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 }

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.


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.



0

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

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.