Как я могу проверить, содержит ли массив значение другого массива? - PullRequest
0 голосов
/ 29 мая 2020

Я хотел бы проверить, содержит ли массив значение из другого массива. Например, я хотел бы проверить, содержит ли массив A значение из массива B.

Я ищу любое значение, кроме одного c value.

Ответы [ 5 ]

2 голосов
/ 29 мая 2020

Если вы хотите увидеть, есть ли какое-либо перекрытие между двумя массивами, вы можете сделать это:

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 голос
/ 29 мая 2020

Пример:

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

и должно быть достаточно для большинства типичных casses, например, если оба массива имеют 10 000 000 элементов, это займет около 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
}
0 голосов
/ 29 мая 2020

Вы можете использовать методы 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

0 голосов
/ 29 мая 2020

Возвращает 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()
 }
0 голосов
/ 29 мая 2020

Убедитесь, что ваши array A и B одного типа. затем попробуйте следующее.

for (i in 0..arrayB.size-1) { 
    arrayA.contains(arrayB[i]); 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...