Arrays 如何使用Kotlin检查2D数组中是否存在值?

Arrays 如何使用Kotlin检查2D数组中是否存在值?,arrays,arraylist,kotlin,comparison,equality,Arrays,Arraylist,Kotlin,Comparison,Equality,我试图使用contains(…)查找2D数组中是否存在数组,但即使它在数组中,返回值也是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

我试图使用
contains(…)
查找2D数组中是否存在数组,但即使它在数组中,返回值也是
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。换句话说,它对数组的引用相等,而不是内容相等

您可以使用contentEquals获得所需的结果:

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



您可能会感兴趣。

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

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

arrayListOf(2, 3) == arrayListOf(2, 3) // yields true
arrayOf(…)
创建一个
kotlin.Array
arrayListOf(…)
一个
kotlin.collections.ArrayList

当您调用
数组的
contains(…)
时,它将检查其值的引用,这显然是不同的,因为构造函数被调用两次,每次生成一个新引用

当调用
ArrayList的
contains(…)
时,它将检查其值的内容,这实际上是相同的

旁注:

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

危险数组比较

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

因此,我们得出了已经得出的结论:

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