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())
がありますが、オプションを使用した方が適切に機能するため、インスタンスメソッドを使用したいです。
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)
は、true
とa
が同じ配列を参照する場合にのみb
を返します。
ただし、 extension functions を使用して、独自の「オプション」に優しいメソッドを作成できます。例えば。:
_fun Array<*>.equalsArray(other: Array<*>) = Arrays.equals(this, other)
fun Array<*>.deepEqualsArray(other: Array<*>) = Arrays.deepEquals(this, other)
_
追伸 フィードバックリクエスト:データクラスの制限| Kotlinブログ に関するコメントも読む価値があります。具体的には コメント39364 です。
Kotlin 1.1は、コンテンツごとに配列を比較するための拡張機能を導入しました: contentEquals および contentDeepEquals 。
これらの拡張機能はinfixであるため、次の方法で使用できます。
val areEqual = arr1 contentEquals arr2
そして、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
単純な等号(深い等号ではない!)の場合:
_otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty()
_
このコードは、サイズとアイテムを比較します。アイテムは.equals()
と比較されます。