Подтвердить что ты не робот

Как сравнить два массива в Котлине?

Учитывая некоторые массивы в Котлине

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

Существуют ли встроенные функции для std-lib Kotlin, которые тестируют два массива для (значения) равенства для каждого элемента?

Таким образом, получается:

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

equals() фактически возвращает false в обоих случаях, но, возможно, есть встроенные функции для Kotlin, которые можно использовать?

Существует статическая функция java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray()), но я предпочел бы использовать метод экземпляра, поскольку он лучше работал бы с опциями.

4b9b3361

Ответ 1

В Kotlin 1.1 вы можете использовать contentEquals и contentDeepEquals, чтобы сравнить два массива для структурного равенства. например:.

a contentEquals b // true
b contentEquals c // false

В Kotlin 1.0 нет встроенных функций для std-lib Kotlin, которые тестируют два массива для (значения) равенства для каждого элемента. "

"Массивы всегда сравниваются с помощью 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)

P.S. Комментарии Запрос обратной связи: ограничения на классы данных | Блог Kotlin заслуживает внимания, в частности комментарий 39364.

Ответ 2

Kotlin 1.1 ввел расширения для сравнения массивов по содержанию: contentEquals и contentDeepEquals.

Эти расширения являются инфиксами, поэтому вы можете использовать их следующим образом:

val areEqual = arr1 contentEquals arr2

Ответ 3

И если вы хотите сравнить содержимое двух 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

Ответ 4

Для простых равных (не глубоко равно!):

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

Этот код будет сравнивать размер и элементы. Элементы сравниваются с .equals().