Lar*_*erg 37 arrays equals kotlin
给出了Kotlin中的一些数组
let a = arrayOf("first", "second")
val b = arrayOf("first", "second")
val c = arrayOf("1st", "2nd")
Run Code Online (Sandbox Code Playgroud)
是否存在Kotlin std-lib的内置函数,它们为每个元素测试两个数组的(值)相等性?
从而导致:
a.equals(b) // true
a.equals(c) // false
Run Code Online (Sandbox Code Playgroud)
equals()实际上false在这两种情况下都会返回,但也许Kotlin可以使用内置函数?
有静态函数java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray())但我更喜欢实例方法,因为它可以更好地与选项一起使用.
mfu*_*n26 36
在Kotlin 1.1中,您可以使用contentEquals和contentDeepEquals比较两个数组以获得结构相等性.例如:
a contentEquals b // true
b contentEquals c // false
Run Code Online (Sandbox Code Playgroud)
在Kotlin 1.0中,没有"Kotlin std-lib的内置函数,它为每个元素测试两个数组的(值)相等性."
"总是使用equals()所有其他对象来比较数组"(反馈请求:对数据类的限制| Kotlin博客).
因此a.equals(b)只会返回trueif a并b引用相同的数组.
但是,您可以使用扩展功能创建自己的"选项"友好方法.例如:
fun Array<*>.equalsArray(other: Array<*>) = Arrays.equals(this, other)
fun Array<*>.deepEqualsArray(other: Array<*>) = Arrays.deepEquals(this, other)
Run Code Online (Sandbox Code Playgroud)
PS对反馈请求的评论:对数据类的限制| Kotlin博客也值得一读,特别是评论39364.
Ily*_*lya 21
Kotlin 1.1引入了按内容比较数组的扩展: contentEquals和contentDeepEquals.
这些扩展名是中缀,因此您可以通过以下方式使用它们:
val areEqual = arr1 contentEquals arr2
Run Code Online (Sandbox Code Playgroud)
Ale*_*rol 18
如果你想比较两个Collections 忽略顺序的内容,你可以添加这个简单的扩展:
infix fun <T> Collection<T>.sameContentWith(collection: Collection<T>?)
= collection?.let { this.size == it.size && this.containsAll(it) }
Run Code Online (Sandbox Code Playgroud)
......并像这样使用它:
a = mutableListOf<String>()
b = mutableListOf<String>()
isListsHasSameContent = a sameContentWith b
Run Code Online (Sandbox Code Playgroud)
对于简单的等于(不是深度等于!):
otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty()
Run Code Online (Sandbox Code Playgroud)
此代码将比较尺寸和物品。项目与 进行比较.equals()。
| 归档时间: |
|
| 查看次数: |
20550 次 |
| 最近记录: |