Como verificar se o elemento no groovy array / hash / collection / list?


127

Como faço para descobrir se uma matriz contém um elemento? Eu pensei que poderia haver algo como o [1, 2, 3].includes(1)que avaliaria como true.


Você também pode encontrar o índice de onde esse elemento igual está na lista?
Atharva Johri 30/03/12

2
@AtharvaJohriassert [12,42,33].indexOf(42) == 1
Riggs

Respostas:


138

.contains () é o melhor método para listas, mas para mapas, você precisará usar .containsKey () ou .containsValue ()

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')

Além disso, para verificar se um mapa contém algum valor não nulo em uma determinada chave, basta verificar a expressão a seguir if(aMap["aKey"]==aValue).
Naeel Maqsudov

245

Algum açúcar de sintaxe

1 in [1,2,3]

32
Cuidado. def m = [a: true]; 'a' in m→ verdadeiro ainda def m = [a: false]; 'a' in m→ falso!
Jesse Glick 01/02

55

Para listas, use contains:

[1,2,3].contains(1) == true

16
Provavelmente você quis dizer [1,2,3] .contains (1). Porque eu estou supondo que contém a própria função já retorna um booleano. Por que você deseja compará-lo novamente com um "verdadeiro" codificado?
Harshay Buradkar

6
@HarshayBuradkar Para ter certeza true == true, é claro #joke
Automatico

8

Se você realmente deseja o seu método de inclusão em um ArrayList, basta adicioná-lo:

ArrayList.metaClass.includes = { i -> i in delegate }

3

IMPORTANTE Gotcha para usar .contains () em uma coleção de objetos, como domínios. Se a declaração Domain contiver uma EqualsAndHashCode, ou alguma outra implementação equals () para determinar se esses objetivos são iguais e você a definiu assim ...

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

o .contains (myObjectToCompareTo) avaliará os dados em myObjectToCompareTo com os dados de cada instância do objeto na coleção. Portanto, se o seu método equals não for adequado, como o meu não foi, você poderá ver resultados inesperados.


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

Fiz isso assim, para que funcione se alguém estiver procurando.



0

Você também pode usar correspondências com expressões regulares como esta:

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.