Comment vérifier si un élément dans groovy array / hash / collection / list?

127

Comment déterminer si un tableau contient un élément? J'ai pensé qu'il pourrait y avoir quelque chose comme [1, 2, 3].includes(1)qui évaluerait comme true.

banderson623
la source
Pouvez-vous trouver l'index de l'emplacement de cet élément égal dans la liste?
Atharva Johri
2
@AtharvaJohriassert [12,42,33].indexOf(42) == 1
Riggs

Réponses:

138

.contains () est la meilleure méthode pour les listes, mais pour les cartes, vous devrez utiliser .containsKey () ou .containsValue ()

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')
Shemnon
la source
Et, en plus, pour vérifier si une carte contient une valeur non nulle sous une certaine clé, il suffit de vérifier l'expression suivante if(aMap["aKey"]==aValue).
Naeel Maqsudov
245

Un peu de sucre de syntaxe

1 in [1,2,3]
Dahernan
la source
32
Prudent. def m = [a: true]; 'a' in m→ vrai encore def m = [a: false]; 'a' in m→ faux!
Jesse Glick
55

Pour les listes, utilisez contains:

[1,2,3].contains(1) == true
banderson623
la source
16
Vous vouliez probablement dire [1,2,3] .contains (1). Parce que je suppose que contient la fonction elle-même renvoie déjà un booléen. Pourquoi voulez-vous le comparer à nouveau avec un «vrai» codé en dur.
Harshay Buradkar
6
@HarshayBuradkar Pour être vraiment sûr true == true, bien sûr #joke
Automatico
8

Si vous voulez vraiment votre méthode includes sur une ArrayList, ajoutez-la simplement:

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

IMPORTANT Gotcha pour utiliser .contains () sur une collection d'objets, tels que les domaines. Si la déclaration de domaine contient un EqualsAndHashCode, ou une autre implémentation equals () pour déterminer si ces Ojbects sont égaux, et que vous l'avez défini comme ceci ...

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

puis le .contains (myObjectToCompareTo) évaluera les données de myObjectToCompareTo avec les données de chaque instance Object de la collection. Donc, si votre méthode d'égalité n'est pas à la hauteur, comme la mienne ne l'était pas, vous pourriez voir des résultats inattendus.

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

Je l'ai fait comme ça, donc ça marche si quelqu'un le cherche.

HinataXV
la source
0

Vous pouvez également utiliser des correspondances avec une expression régulière comme celle-ci:

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