在Kotlin中,如何检查包含一个或另一个值?

ADe*_*Dev 20 arrays kotlin

在Kotlin,我们可以做到:

val arr = intArrayOf(1,2,3)
if (2 in arr)
   println("in list")
Run Code Online (Sandbox Code Playgroud)

但是,如果我想检查2 3是否在arr,除了以下之外,最常用的方法是:

if (2 in arr || 3 in arr)
   println("in list")
Run Code Online (Sandbox Code Playgroud)

aga*_*aga 24

我使用any()扩展方法:

arrayOf(1, 2, 3).any { it == 2 || it == 3 }
Run Code Online (Sandbox Code Playgroud)

这样,您只遍历数组一次并且您不创建一个集合实例只是为了检查它是否为空(就像在这个问题的其他答案之一).


Mat*_*usz 16

您可以使用intersect方法,它将iterable作为参数并返回仅包含您的集合和您提供的可迭代项目的集合.然后在那个集合上你只需要做大小检查.

这是样本:

val array1 = arrayOf(1, 2, 3, 4, 5, 6)
val array2 = arrayOf(2, 5)

// true if array1 contains any of the items from array2
if(array1.intersect(array2.asIterable()).isNotEmpty()) {
    println("in list")
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*zel 12

这是我能想到的最短和最惯用的方式,any并且in:

val values = setOf(2, 3)
val array = intArrayOf(1, 2, 3)

array.any { it in values }
Run Code Online (Sandbox Code Playgroud)

当然,您也可以使用in运算符的函数引用:

array.any(values::contains)
Run Code Online (Sandbox Code Playgroud)

setOf用于第一个集合,因为顺序无关紧要.

编辑:我切换valuesarray,因为alex.dorokhow的答案.该命令对于检查工作而言与性能无关.


OP希望以最惯用的方式解决这个问题.如果你想以更有效的方式去寻找ada的答案.


ale*_*hov 7

结合使用@aga和@ willi-mentzel解决方案可提高效率并动态设置检查值:

val numbers = setOf(2, 3)
arrayOf(1, 2, 3).any(numbers::contains)
Run Code Online (Sandbox Code Playgroud)

是这种情况下,数组将仅完全迭代一次(最多,在最坏的情况下)。

比(@WilliMentzel建议)效率更高:

numbers.any(arrayOf(1, 2, 3)::contains) // don't do that!
Run Code Online (Sandbox Code Playgroud)

在最坏的情况下,将在哪里迭代数组set.count次。

请注意,Set.contains具有O(1)复杂度,但是IntArray :: contains具有O(N)。

当然,只有在集合或数组足够大的情况下,这种优化才有意义。


Leo*_*der 5

另一种方便的方法实际上不是 Kotlin 的方法,而是使用 Java 集合。
知道它也很好。

Collections.disjoint(Collection<?> c1, Collection<?> c2)
Run Code Online (Sandbox Code Playgroud)

如果两个指定的集合没有共同元素,则返回 {@code true}。

@Test
fun disjointCollections() {
    val list = listOf(1, 2, 3)

    assertTrue(Collections.disjoint(list, listOf(7, 8)))
    assertFalse(Collections.disjoint(list, listOf(1)))
}
Run Code Online (Sandbox Code Playgroud)