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

omvjsjqw  于 2023-04-10  发布在  Android
关注(0)|答案(6)|浏览(487)

我想检查一个数组是否包含另一个数组中的值。例如,我想检查数组A是否包含数组B中的值。
我在寻找任何值,而不是一个特定的值。

z9smfwbn

z9smfwbn1#

如果你想看看两个数组之间是否有任何重叠,你可以这样做:

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

这是一个复杂度为O(n^2)的问题,所以我们可以用一个复杂度为O(n^2)的问题来解决。

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

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

3j86kqsm

3j86kqsm2#

示例:

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中实现交集使用Set:

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

并且对于大多数典型的CASE应该足够了,例如,如果两个阵列都具有10000000个元件,则这花费大约8秒。
如果数组非常大(例如,当如此大量的元素的集合不适合内存时),可能的解决方案是对数组进行排序,并执行类似于合并排序数组的操作:

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
}
w1e3prcc

w1e3prcc3#

确保你的array A和B是相同的类型。然后像下面这样尝试。

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

lstz6jyr4#

您可以使用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

gfttwv5a

gfttwv5a5#

如果任何值匹配,则返回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()
 }
k4emjkb1

k4emjkb16#

val arrayOne = arrayOf("a","b")
    val arrayTwo = arrayOf("b", "c")
    val intersectionArray = mutableListOf<String>()

    arrayOne.forEach {
        if (arrayTwo.contains(it)) intersectionArray.add(it)
    }

    //true or false, if the two arrays have any intersect or not
    val arrayOneAndArrayTwoHaveIntersect = intersectionArray.size > 0
    println("Array One contains an element of Array two: $arrayOneAndArrayTwoHaveIntersect")

    //show the actual values that can be found in the two arrays
    if (arrayOneAndArrayTwoHaveIntersect){
        println("\n\nThe element(s) that can be found in the two arrays are as follows: \n")
        intersectionArray.forEach {
            println(it)
        }
    }

相关问题