web-dev-qa-db-ja.com

Kotlinの2つの配列を比較する方法は?

Kotlinのいくつかの配列を考える

_let a = arrayOf("first", "second")
val b = arrayOf("first", "second")
val c = arrayOf("1st", "2nd")
_

Kotlin std-libには、各要素の(値)の等価性について2つの配列をテストする組み込み関数がありますか?

その結果:

_a.equals(b) // true
a.equals(c) // false
_

equals()は両方のケースで実際にfalseを返しますが、Kotlinに使用できる組み込み関数があるかもしれません。

静的関数Java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray())がありますが、オプションを使用した方が適切に機能するため、インスタンスメソッドを使用したいです。

36
Lars Blumberg

Kotlin 1.1では、 contentEquals および contentDeepEquals を使用して、structural平等。例えば。:

_a contentEquals b // true
b contentEquals c // false
_

Kotlin 1.0には、「各要素の(値)の等価性について2つの配列をテストするKotlin std-libの組み込み関数」はありません。

「他のすべてのオブジェクトと同様に、配列は常にequals()を使用して比較されます」( フィードバック要求:データクラスの制限| Kotlinブログ )。

したがって、a.equals(b)は、trueaが同じ配列を参照する場合にのみbを返します。

ただし、 extension functions を使用して、独自の「オプション」に優しいメソッドを作成できます。例えば。:

_fun Array<*>.equalsArray(other: Array<*>) = Arrays.equals(this, other)
fun Array<*>.deepEqualsArray(other: Array<*>) = Arrays.deepEquals(this, other)
_

追伸 フィードバックリクエスト:データクラスの制限| Kotlinブログ に関するコメントも読む価値があります。具体的には コメント39364 です。

35
mfulton26

Kotlin 1.1は、コンテンツごとに配列を比較するための拡張機能を導入しました: contentEquals および contentDeepEquals

これらの拡張機能はinfixであるため、次の方法で使用できます。

val areEqual = arr1 contentEquals arr2
21
Ilya

そして、2つのCollectionsの内容を比較したい場合順序を無視してこの単純な拡張を追加できます:

infix fun <T> Collection<T>.sameContentWith(collection: Collection<T>?)
    = collection?.let { this.size == it.size && this.containsAll(it) }

...そして次のように使用します:

a = mutableListOf<String>()
b = mutableListOf<String>()

isListsHasSameContent = a sameContentWith b
18
Alexander Krol

単純な等号(深い等号ではない!)の場合:

_otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty()
_

このコードは、サイズとアイテムを比較します。アイテムは.equals()と比較されます。

3
Kevin Robatel