Как проверить, что значение существует внутри 2D-массива с Kotlin? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь выяснить, существует ли массив внутри 2D-массива, используя contains(...), но даже если он находится в массиве, возвращаемое значение равно false.Почему и как я могу заставить это работать?

val obs = arrayOf (arrayOf(5, 5),arrayOf(4, 2),arrayOf(2, 3))
println(obs.contains(arrayOf(2, 3))) // false

val obs1 = arrayListOf (arrayListOf(5, 5), arrayListOf(4, 2), arrayListOf(2, 3))
println(obs1.contains(arrayListOf(2, 3))) // true

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Давайте разберем цикл до индивидуального сравнения.В основном происходит сравнение, подобное этому:

arrayOf(2, 3) == arrayOf(2, 3) // yields false

arrayListOf(2, 3) == arrayListOf(2, 3) // yields true

arrayOf(...) создает kotlin.Array и arrayListOf(...) и kotlin.collections.ArrayList.

Когда вы звоните contains(...) из Array он проверит ссылку своих значений, которая, очевидно, отличается, так как конструктор вызывается дважды, каждый раз получая новую ссылку.

Когда вы вызываете contains(...) из ArrayList, он проверяет наличиесодержимое его значений, которое действительно одинаково.

Примечание:

Если вы введете arrayOf(2, 3) == arrayOf(2, 3) в IntelliJ, оно даже предупредит вас

Сравнение опасных массивов

и подсказка для его исправления - заменить == на contentEquals.Поскольку вы хотите сделать это для нескольких элементов в вашем массиве, вы должны сделать это для каждого элемента (по крайней мере, пока не будет совпадения), например, используя any.

Итак, мы приходим к тому, что Аомин уже заключил:

obs.any { it.contentEquals(arrayOf(2,3)) }
0 голосов
/ 30 декабря 2018

obs.contains(arrayOf(2,3)) даст только true, если ссылка arrayOf(2,3) равна любой из ссылок в obs.другими словами, он прибегает к ссылке равенству для массивов вместо содержимому равенству.

Вы можете получить требуемый результат, используя contentEquals :

println(obs.any { it.contentEquals(arrayOf(2,3)) }) // true

Вторая версия печатается, как и ожидалось, поскольку коллекции сравниваются структурно .


Вы можете найти ЧтоВы не знали о массивах в Kotlin интереса.

...