2016-02-08 12 views
20

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

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

Имеются встроенные функции к Котлин станд-Lib, который проверяет два массива для (значение) равенства для каждого элемента?

Таким образом, в результате чего:

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

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

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

+0

Это, вероятно, случай для функций расширения. –

ответ

17

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

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

val areEqual = arr1 contentEquals arr2 
15

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

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

В Котлин 1.0 Есть нет «встроенных функций в Котлин станд-Lib, который проверяет два массива для (значение) равенства для каждого элемента.»

«Массивы всегда сравниваются с использованием equals(), так как все остальные объекты» (Feedback Request: Limitations on Data Classes | Kotlin Blog).

Так 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) 

P.S. Замечания по Feedback Request: Limitations on Data Classes | Kotlin Blog заслуживают внимания, а именно comment 39364.

1

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

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

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

+5

Это не учитывает порядок массива; однако общий метод хорош для наборов. –

1

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