2016-02-08 16 views
20

Dato alcuni array in KotlinCome confrontare due array in Kotlin?

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

Esistono funzioni incorporate alla std-lib Kotlin che verifica due array per (valore) parità per ciascun elemento?

Così conseguente:

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

equals() è in realtà tornando false in entrambi i casi, ma forse ci sono funzioni incorporate per Kotlin che si potrebbe usare?

C'è la funzione statica java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray()) ma preferirei preferire un metodo di istanza poiché funzionerebbe meglio con gli optionals.

+0

Questo probabilmente è un caso per le funzioni di estensione. –

risposta

17

Kotlin 1.1 ha introdotto estensioni per il confronto di matrici per contenuto: contentEquals e contentDeepEquals.

Queste estensioni sono infisso, in modo da poter utilizzare le seguente modo:

val areEqual = arr1 contentEquals arr2 
15

In Kotlin 1.1 è possibile utilizzare contentEquals e contentDeepEquals per confrontare due matrici per strutturale uguaglianza. es .:

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

In Kotlin 1.0 non ci sono "funzioni integrate alla std-lib Kotlin che verifica due array per (valore) parità per ciascun elemento."

"Gli array vengono sempre confrontati utilizzando equals(), come tutti gli altri oggetti" (Feedback Request: Limitations on Data Classes | Kotlin Blog).

Quindi a.equals(b) restituirà solo se a e fanno riferimento allo stesso array.

È tuttavia possibile creare i propri metodi "opzionali" utilizzando extension functions. ad esempio:

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

P.S. I commenti su Feedback Request: Limitations on Data Classes | Kotlin Blog valgono anche una lettura, in particolare comment 39364.

1

Per un semplice uguali (non profondi equals!):

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

Questo codice confrontare le dimensioni e le voci. Gli articoli sono confrontati con .equals().

+5

Questo non tiene conto dell'ordine della matrice; tuttavia il metodo generale è buono per gli insiemi. –

1

E se si vuole comparare i contenuti di due Collectionsignorando l'ordine è possibile aggiungere questa semplice estensione:

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

... e usarlo in questo modo:

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

isListsHasSameContent = a sameContentWith b