2016-02-08 14 views
20

Kotlin में कुछ सरणियों को देखते हुएकोटलिन में दो सरणी की तुलना कैसे करें?

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

वहाँ हैं Kotlin एसटीडी-लिब कि के लिए (मान) प्रत्येक तत्व के लिए समानता दो सरणियों परीक्षण करने के लिए बिल्ट-इन कार्य?

इस प्रकार है, जिसके परिणामस्वरूप:

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

equals() वास्तव में दोनों ही मामलों में false लौटा रहा है, लेकिन शायद वहाँ Kotlin को बिल्ट-इन कार्य कर रहे हैं कि एक का उपयोग कर सकता है?

स्थिर कार्य java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray()) है लेकिन मैं एक उदाहरण विधि पसंद करूंगा क्योंकि यह विकल्प के साथ बेहतर काम करेगा।

+0

यह शायद विस्तार कार्यों के लिए एक मामला है। –

उत्तर

17

कोटलिन 1.1 ने सामग्री द्वारा सरणी की तुलना करने के लिए एक्सटेंशन पेश किए: contentEquals और contentDeepEquals

इन एक्सटेंशन, इन्फ़िक्स हैं ताकि आप उन्हें निम्नलिखित तरीके से उपयोग कर सकते हैं:

val areEqual = arr1 contentEquals arr2 
15

Kotlin 1.1 में आप contentEquals और contentDeepEquals का उपयोग संरचनात्मक समानता के लिए दो सरणियों की तुलना कर सकते हैं। उदा .:

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

Kotlin 1.0 में देखते हैं नहीं "में निर्मित Kotlin एसटीडी-लिब कि के लिए (मान) प्रत्येक तत्व के लिए समानता दो सरणियों परीक्षण करने के लिए कार्य करता है।"

"सभी अन्य ऑब्जेक्ट्स के रूप में equals() का उपयोग करके Arrays की तुलना हमेशा की जाती है" (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) 

पीएस 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 
संबंधित मुद्दे