¿Cómo verificar si el elemento en groovy array / hash / collection / list?

127

¿Cómo puedo saber si una matriz contiene un elemento? Pensé que podría haber algo como [1, 2, 3].includes(1)lo que evaluaría como true.

banderson623
fuente
¿Puedes encontrar el índice también de dónde está este elemento igual en la lista?
Atharva Johri
2
@AtharvaJohriassert [12,42,33].indexOf(42) == 1
Riggs

Respuestas:

138

.contains () es el mejor método para las listas, pero para los mapas deberá usar .containsKey () o .containsValue ()

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')
Shemnon
fuente
Y, además, para verificar si un mapa contiene algún valor no nulo bajo una determinada clave, es suficiente verificar la siguiente expresión if(aMap["aKey"]==aValue).
Naeel Maqsudov
245

Un poco de sintaxis de azúcar

1 in [1,2,3]
dahernan
fuente
32
Cuidado. def m = [a: true]; 'a' in m→ verdadero pero def m = [a: false]; 'a' in m→ falso!
Jesse Glick
55

Para listas, use contains:

[1,2,3].contains(1) == true
banderson623
fuente
16
Probablemente quisiste decir [1,2,3] .contains (1). Porque supongo que contiene la función en sí misma ya devuelve un valor booleano. ¿Por qué quieres compararlo de nuevo con un 'verdadero' codificado?
Harshay Buradkar
66
@HarshayBuradkar Para asegurarse realmente true == true, por supuesto #joke
Automatico
8

Si realmente desea su método de inclusión en una ArrayList, simplemente agréguelo:

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

IMPORTANTE Gotcha para usar .contains () en una colección de objetos, como dominios. Si la declaración de dominio contiene un EqualsAndHashCode, o alguna otra implementación de equals () para determinar si esos Ojbects son iguales, y lo ha configurado así ...

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

entonces .contains (myObjectToCompareTo) evaluará los datos en myObjectToCompareTo con los datos para cada instancia de Object en la Colección. Entonces, si su método de igualdad no está a la altura del tabaco, como el mío no, es posible que vea resultados inesperados.

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

Lo hice así, así que funciona si alguien lo está buscando.

HinataXV
fuente
0

También puede usar coincidencias con expresiones regulares como esta:

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