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.


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

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]

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

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 }

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.


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.



0

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

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.