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

时间:2018-12-29 20:36:48

标签: arrays arraylist kotlin comparison equality

我正在尝试使用 Container( decoration: new BoxDecoration( image: new DecorationImage( image: new AssetImage("images/logo.png"), fit: BoxFit.fill, ), ), ), 查找2D数组中是否存在数组,但是即使它在数组中,返回值也为contains(...)。为什么以及如何使它起作用?

false

2 个答案:

答案 0 :(得分:2)

obs.contains(arrayOf(2,3))仅在arrayOf(2,3)的引用等于obs中的任何引用的情况下产生true。换句话说,它对数组使用 reference 相等性 而不是 content 相等性。

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

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

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


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

答案 1 :(得分:1)

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

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

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

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

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

当您调用contains(...)中的ArrayList时,它将检查其值的内容,这确实是相同的。

旁注:

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

  

危险数组比较

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

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

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