2016-02-08 18 views
20

鑑於某些陣列在科特林如何比較Kotlin中的兩個數組?

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

是否有內置功能的科特林STD-lib中,測試兩個數組的每個元素(值)相等?

所以導致:

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

equals()真的返回在這兩種情況下false,但也許還有內置的功能來科特林,人們可以使用?

有靜態函數java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray())但我寧願更喜歡實例方法,因爲它可以更好地與選項。

+0

這可能是擴展功能的一種情況。 –

回答

17

Kotlin 1.1引入了用於按內容比較陣列的擴展: contentEqualscontentDeepEquals

這些擴展,這樣你就可以使用它們的方式如下:

val areEqual = arr1 contentEquals arr2 
15

在Kotlin 1.1中,您可以使用contentEqualscontentDeepEquals來比較兩個數組結構的等式。例如爲:

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

在科特林1.0有沒有「內置函數到科特林STD-LIB,測試兩個陣列爲每個元素(值)相等」。

「總是使用equals()來比較陣列,因爲所有其他對象」(Feedback Request: Limitations on Data Classes | Kotlin Blog)。

所以a.equals(b)將只返回true如果ab引用相同的數組。

但是,您可以使用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