如何使用 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.Array
和 arrayListOf(...)
一个 kotlin.collections.ArrayList
.
当您调用 Array
的 contains(...)
时,它将检查其值的引用,这显然是不同的,因为构造函数被调用两次,每次都会产生一个新的引用。
当你调用ArrayList
的contains(...)
时,它会检查它的值的内容,这确实是一样的。
旁注:
如果你在 IntelliJ 中输入 arrayOf(2, 3) == arrayOf(2, 3)
,它甚至会警告你
Dangerous array comparison
修复它的技巧是将 ==
替换为 contentEquals
。由于您想对数组中的多个元素执行此操作,因此您必须对每个元素执行此操作(至少在匹配之前),例如使用 any
.
所以,我们得出 Aomine 已经得出的结论:
obs.any { it.contentEquals(arrayOf(2,3)) }
我正在尝试使用 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.Array
和 arrayListOf(...)
一个 kotlin.collections.ArrayList
.
当您调用 Array
的 contains(...)
时,它将检查其值的引用,这显然是不同的,因为构造函数被调用两次,每次都会产生一个新的引用。
当你调用ArrayList
的contains(...)
时,它会检查它的值的内容,这确实是一样的。
旁注:
如果你在 IntelliJ 中输入 arrayOf(2, 3) == arrayOf(2, 3)
,它甚至会警告你
Dangerous array comparison
修复它的技巧是将 ==
替换为 contentEquals
。由于您想对数组中的多个元素执行此操作,因此您必须对每个元素执行此操作(至少在匹配之前),例如使用 any
.
所以,我们得出 Aomine 已经得出的结论:
obs.any { it.contentEquals(arrayOf(2,3)) }