如何在Groovy数组/哈希表/集合/列表中检查元素?

157

如何确定一个数组是否包含某个元素? 我认为可能有类似于[1, 2, 3].includes(1)这样的东西,其结果将会是true


你能找到列表中相等元素的索引吗? - Arturo
2
@AtharvaJohri assert [12,42,33].indexOf(42) == 1 断言 [12,42,33] 中的 42 的索引为 1 - Thomas Traude
8个回答

285

一些语法糖

1 in [1,2,3]

40
小心。def m = [a: true]; 'a' in m → 结果为 true ,但 def m = [a: false]; 'a' in m → 结果为 false! - Jesse Glick
你怎么否定这个? - Big McLargeHuge
@BigMcLargeHuge !(1 in [1,2,3]) -> !(1在[1,2,3]中) - Leponzo
3
处理 [a:false] 的方法是使用 contains。[a: false].containsKey('a') -> true。 - wiredniko
1
@Big McLargeHuge 否定也可以像这样实现:1 !in [1,2,3]Groovy成员运算符 - david
太棒了!尽管@JesseGlick提到了布尔值的注意事项。(当afalse时,这甚至可能是期望的结果,这取决于问题是什么。) - undefined

158

.contains()是处理列表最好的方法,但对于映射,您需要使用.containsKey()或.containsValue()

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

而且,为了检查一个映射是否在某个键下包含一些非空值,只需要检查以下表达式 if(aMap["aKey"]==aValue) - Naeel Maqsudov

69

对于列表,请使用contains

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

21
你可能想说的是[1,2,3].contains(1)。因为我猜测contains函数本身已经返回一个布尔值。你为什么还要将其与硬编码的“true”进行比较呢? - Harshay Buradkar
6
为了确保“true == true”是真的,当然是开玩笑的。 - Automatico

10

8
如果你真的想在ArrayList上使用includes方法,只需添加它:
ArrayList.metaClass.includes = { i -> i in delegate }

3

当使用.contains()方法在对象集合中查找内容时,需要注意以下重要问题。如果这些对象的声明包含了EqualsAndHashCode或其他equals()实现方式来判断它们是否相等,并且你已将其设置为如下代码...

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

那么 .contains(myObjectToCompareTo) 将会将 myObjectToCompareTo 中的数据与 Collection 中每个 Object 实例的数据进行比较。因此,如果您的 equals 方法不够完善,就像我的一样,您可能会看到意想不到的结果。


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

我这样做是为了让其他人也能找到正确的方法。

0

你也可以像这样使用正则表达式匹配:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接