如何使用 Kotlin 检查二维数组中是否存在值?

How to check value exist inside 2D array with Kotlin?

我正在尝试使用 contains(...) 查找二维数组中是否存在数组,但即使它在数组中,return 的值也是 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

obs.contains(arrayOf(2,3)) 仅当 arrayOf(2,3) 的引用等于 obs 中的任何引用时才会产生 true。换句话说,它诉诸 reference 相等 for arrays 而不是 content equality.

您可以使用 contentEquals:

得到您需要的结果
println(obs.any { it.contentEquals(arrayOf(2,3)) }) // true

第二个版本按预期打印,因为集合在结构上比较


您可能会发现 What you didn’t know about arrays in Kotlin 感兴趣。

让我们将循环分解为单独的比较。基本上发生的是这样的比较:

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

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

arrayOf(...) 创建一个 kotlin.ArrayarrayListOf(...) 一个 kotlin.collections.ArrayList.

当您调用 Arraycontains(...) 时,它将检查其值的引用,这显然是不同的,因为构造函数被调用两次,每次都会产生一个新的引用。

当你调用ArrayListcontains(...)时,它会检查它的值的内容,这确实是一样的。

旁注:

如果你在 IntelliJ 中输入 arrayOf(2, 3) == arrayOf(2, 3),它甚至会警告你

Dangerous array comparison

修复它的技巧是将 == 替换为 contentEquals。由于您想对数组中的多个元素执行此操作,因此您必须对每个元素执行此操作(至少在匹配之前),例如使用 any.

所以,我们得出 Aomine 已经得出的结论:

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