Как проверить, есть ли элемент в массиве / хэше / коллекции / списке Groovy?

Как определить, содержит ли массив элемент? Я подумал, что может быть что-то вроде [1, 2, 3].includes(1), которое оценивается как true.


person banderson623    schedule 09.09.2008    source источник
comment
Можете ли вы найти индекс также и в том месте, где находится этот равный элемент в списке?   -  person Atharva Johri    schedule 30.03.2012
comment
@AtharvaJohri assert [12,42,33].indexOf(42) == 1   -  person Thomas Traude    schedule 30.03.2012


Ответы (8)


.contains () - лучший метод для списков, но для карт вам нужно будет использовать .containsKey () или .containsValue ()

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')
person shemnon    schedule 15.09.2008
comment
И, кроме того, чтобы проверить, содержит ли карта какое-либо ненулевое значение под определенным ключом, достаточно проверить следующее выражение if(aMap["aKey"]==aValue). - person Naeel Maqsudov; 18.12.2017

Немного синтаксического сахара

1 in [1,2,3]
person dahernan    schedule 15.09.2008
comment
Осторожный. def m = [a: true]; 'a' in m → правда, но def m = [a: false]; 'a' in m → ложь! - person Jesse Glick; 01.02.2017
comment
Как вы это отрицаете? - person Big McLargeHuge; 08.08.2020

Для списков используйте contains:

[1,2,3].contains(1) == true
person banderson623    schedule 09.09.2008
comment
Вероятно, вы хотели сказать [1,2,3] .contains (1). Поскольку я предполагаю, что функция contains сама уже возвращает логическое значение. Почему вы хотите снова сравнить это с жестко запрограммированной «истиной». - person Harshay Buradkar; 30.11.2012
comment
@HarshayBuradkar Чтобы убедиться true == true, конечно # шутка - person Automatico; 20.01.2015

Если вам действительно нужен метод include в ArrayList, просто добавьте его:

ArrayList.metaClass.includes = { i -> i in delegate }
person John Flinchbaugh    schedule 02.10.2008

Вы можете использовать оператор членства:

def list = ['Grace','Rob','Emmy']
assert ('Emmy' in list)  

оператор членства Groovy

person MagGGG    schedule 22.01.2020

ВАЖНО! Попробуй использовать .contains () для коллекции объектов, таких как домены. Если объявление домена содержит EqualsAndHashCode или некоторую другую реализацию equals (), чтобы определить, равны ли эти Ojbects, и вы установили его следующим образом ...

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

тогда .contains (myObjectToCompareTo) будет оценивать данные в myObjectToCompareTo с данными для каждого экземпляра объекта в коллекции. Итак, если ваш метод equals не подходит, как мой, вы можете увидеть неожиданные результаты.

person Twelve24    schedule 31.12.2014

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

Сделал вот так, работает, если кто то ищет.

person HinataXV    schedule 08.10.2016

Вы также можете использовать совпадения с регулярным выражением, например:

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