如何比较Kotlin中的两个数组?
给Kotlin中的一些数组
let a = arrayOf("first", "second") val b = arrayOf("first", "second") val c = arrayOf("1st", "2nd")
Kotlin std-lib是否有内置的函数来测试每个元素的(值)相等的两个数组?
由此导致:
a.equals(b) // true a.equals(c) // false
equals()
实际上在两种情况下都返回false
,但是可能有内置函数可供Kotlin使用?
有静态函数java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray())
但我宁愿一个实例方法,因为它会更好地与optionals。
Kotlin 1.1引入了按内容比较数组的扩展: contentEquals和contentDeepEquals 。
这些扩展名是infix ,所以你可以用下面的方法来使用它们:
val areEqual = arr1 contentEquals arr2
在Kotlin 1.1中,可以使用contentEquals
和contentDeepEquals
来比较两个数组的结构是否相等。 例如:
a contentEquals b // true b contentEquals c // false
在Kotlin 1.0中,没有“Kotlin std-lib的内置函数,它为每个元素的(值)相等性测试两个数组。
“数组总是使用equals()
和所有其他对象进行比较”( 反馈请求:对数据类的限制| Kotlin博客 )。
所以a.equals(b)
只会返回true
如果a
和b
引用相同的数组。
但是,您可以使用扩展功能创建您自己的“选项” – 友好的方法。 例如:
fun Array<*>.equalsArray(other: Array<*>) = Arrays.equals(this, other) fun Array<*>.deepEqualsArray(other: Array<*>) = Arrays.deepEquals(this, other)
PS 反馈请求上的注释:数据类的限制| Kotlin博客也值得一读,特别是评论39364 。
对于一个简单的等于(不深等于!):
otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty()
这段代码将比较大小和项目。 这些项目与.equals()
进行比较。