¿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.


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

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]

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

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 }

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.


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.



0

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

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.