我正在尝试使用 Container(
decoration: new BoxDecoration(
image: new DecorationImage(
image: new AssetImage("images/logo.png"),
fit: BoxFit.fill,
),
),
),
查找2D数组中是否存在数组,但是即使它在数组中,返回值也为contains(...)
。为什么以及如何使它起作用?
false
答案 0 :(得分:2)
obs.contains(arrayOf(2,3))
仅在arrayOf(2,3)
的引用等于obs
中的任何引用的情况下产生true。换句话说,它对数组使用 reference 相等性 而不是 content 相等性。
您可以使用 contentEquals 获得所需的结果:
println(obs.any { it.contentEquals(arrayOf(2,3)) }) // true
第二个版本按预期打印,因为对集合进行了结构上的比较。
答案 1 :(得分:1)
让我们将循环分解为一个单独的比较。基本上发生的是这样的比较:
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
时,它将检查其值的内容,这确实是相同的。
旁注:
如果您在IntelliJ中键入arrayOf(2, 3) == arrayOf(2, 3)
,它甚至会警告您
危险数组比较
修复该问题的技巧是将==
替换为contentEquals
。由于要对数组中的多个元素执行此操作,因此必须对每个元素执行此操作(至少直到存在匹配项为止),例如使用any
。
因此,我们得出Aomine已经得出的结论:
obs.any { it.contentEquals(arrayOf(2,3)) }