我想检查一个数组是否包含另一个数组的值。例如,我想检查数组A是否包含来自数组B的值。
我正在寻找任何值,而不是一个特定值。
答案 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)
您可以使用any
和contains
方法来检查是否存在公共元素。
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