如何检查一个数组是否包含另一个数组的值?

时间:2020-05-29 14:04:44

标签: android kotlin

我想检查一个数组是否包含另一个数组的值。例如,我想检查数组A是否包含来自数组B的值。

我正在寻找任何值,而不是一个特定值。

5 个答案:

答案 0 :(得分:2)

如果要查看两个数组之间是否完全重叠,可以执行以下操作:

fun Array<*>.intersects(other: Array<*>) = any { it in other }

如下面的评论中所述,这是O(n ^ 2),因此对于大型数组,建议:

fun Array<*>.intersects(other: Array<*>) = intersect(other.toSet()).isNotEmpty()

toSet()仅在第二个集合是数组而不是类似Iterable的List时才需要。

答案 1 :(得分:1)

示例:

val a = arrayOf(1, 2, 5, 7, 9, 15)
val b = arrayOf(15, 3, 5, 8)
val c = a intersect b.toList()
if (!c.isEmpty()) {
    println("Arrays have common elements ${c}")
} else {
    println("Arrays do not have common elements")
}

结果:

Arrays have common elements [5, 15]

实施与Kotlin使用集相交:

val set = this.toMutableSet()
set.retainAll(other)
return set

并且对于大多数典型的casse应该足够了,例如,如果两个数组都具有1 000 000个元素,则大约需要8 s。

如果数组非常大(例如,当如此大量的元素集不适合存储在内存中时),可能的解决方案是对数组进行排序,并进行诸如合并排序数组之类的事情:

fun hasIntersection(a: IntArray, b: IntArray): Boolean {
    a.sort()
    b.sort()
    var i = 0
    var j = 0
    while (i < a.size && j < b.size) {
        if (a[i] < b[j]) {
            i++
        } else if (a[i] > b[j]) {
            j++
        } else {
            return true
        }
    }
    return false
}

答案 2 :(得分:0)

确保您的array A和B是同一类型。 然后尝试如下所示。

for (i in 0..arrayB.size-1) { 
    arrayA.contains(arrayB[i]); 
} 

答案 3 :(得分:0)

如果任何值匹配,则返回true

  private fun ArrayList<Int>.isAnyValueMatched(list2:ArrayList<Int> ):Boolean{
        this.forEach { value1->
            list2.forEach {
                value2->
                if (value1==value2) return true
            }
        }
        return false
    }

或使用intersect ( 返回一个包含该数组和指定集合都包含的所有元素的集合。

private fun ArrayList<Int>.isAnyValueMatched(list2:ArrayList<Int> ):Boolean{
        return (this intersect list2).isNotEmpty()
 }

答案 4 :(得分:0)

您可以使用anycontains方法来检查是否存在公共元素。

val a = arrayOf(1, 2, 5, 7, 9, 15)
val b = arrayOf(15, 3, 5, 8)

println(a.any(b::contains))
// true

请注意:此方法不是很有效。最坏情况下的复杂度为n ^ 2。一种提高性能的方法是将完成查找的数组(例如,b)转换为Set

相关问题