如何比较Kotlin中的两个数组?

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中,您可以使用contentEqualscontentDeepEquals比较两个数组以获得结构相等性.例如:

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 ab引用相同的数组.

但是,您可以使用扩展功能创建自己的"选项"友好方法.例如:

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引入了按内容比较数组的扩展: contentEqualscontentDeepEquals.

这些扩展名是中,因此您可以通过以下方式使用它们:

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)

  • 注意边缘状况;`listOf("a", "b", "b").sameContentWith(listOf("a", "a", "b"))` 当可能返回 false 时为 true。 (4认同)
  • 不幸的是,“sameContentWith”有更多错误。您可以将不在右侧集合中的元素放入左侧集合中,即使如此,`sameContentWith` 也可能返回 true - 例如在本例中: `listOf("a", "b").sameContentWith(listOf("一个”,“一个”))` (2认同)

Kev*_*tel 5

对于简单的等于(不是深度等于!):

otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty()
Run Code Online (Sandbox Code Playgroud)

此代码将比较尺寸和物品。项目与 进行比较.equals()

  • 这不考虑数组的顺序;然而,一般方法对于集合来说是有好处的。 (9认同)