Как сравнить два массива в Котлине?
Учитывая некоторые массивы в Котлине
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())
, но я предпочел бы использовать метод экземпляра, поскольку он лучше работал бы с опциями.
Ответы
Ответ 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()
.