2011-03-22 8 views
51
val a: Array[Int] = Array(1,2,4,5) 
val b: Array[Int] = Array(1,2,4,5) 
a==b // false 

क्या दो सरणी (या अनुक्रम) समकक्ष हैं या नहीं, यह देखने के लिए कोई पैटर्न-मिलान तरीका है?मैं स्केल में दो सरणी की तुलना कैसे करूं?

+1

http://stackoverflow.com/questions/2481149/why-does-array0-1-2-array0-1-2-not-return-the-expected-result और http://stackoverflow.com का डुप्लिकेट/प्रश्न/3737711/क्यों-doesnt-the-array-equality-function-work-as-expected उत्तर उन लोगों के लिए है 'eEEments' –

+1

यह _is_ डुप्लिकेट का उपयोग करना है, लेकिन 'sameElements' नेस्टेड सरणी के लिए चाल नहीं करता है , क्योंकि यह रिकर्सिव नहीं है। मोरित्ज़ का उत्तर नीचे उचित है (जिसे शायद पुराने उत्तरों में जोड़ा जाना चाहिए)। –

उत्तर

77

आप सरणियों की गहरी तुलना करने के लिए

a.deep == b.deep 

करने के लिए अपने अंतिम पंक्ति को बदलने की जरूरत।

+15

यह करने के लिए यह कैननिकल तरीका है। लेकिन प्रदर्शन-भूखे लोगों के लिए सिर्फ एक चेतावनी: यह _does_ दोनों तरफ एक नया संग्रह बनाते हैं, इसलिए यह करने का सबसे प्रभावी तरीका नहीं है। –

+7

@Rex हाँ, यह एक नया संग्रह बनाता है, लेकिन इसका मतलब यह नहीं है कि यह अक्षम है। विधि 'गहरी' के कार्यान्वयन को देखें। यह एक संग्रह बनाता है, जो मूल सरणी में 'लागू' विधि की सभी कॉल अग्रेषित करता है। –

+1

@ ई। Verda - एचएम, कार्यान्वयन वह नहीं है जो मैं उम्मीद करता था। लेकिन यह सरणी के _every element_ के लिए एक पैटर्न मिलान करता है, जो महंगा है अगर यह प्राइमेटिव्स की एक सरणी है, और नेस्टेड एरे के लिए यह हर पहुंच पर array_ को लपेटता है। यदि सरणी लगभग पूरी तरह से अलग हैं तो यह सस्ती है; करीबी सरणी से मेल खाने के लिए, यह एक पुनरावर्ती गैर-रचनात्मक समाधान की तुलना में महंगा होगा। –

18
a.corresponds(b){_ == _} 

Scaladoc: true दोनों दृश्यों अगर एक ही लंबाई और p(x, y) है true सब इसी तत्व this लिपटे सरणी के x और that की y के लिए, अन्यथा false

+4

ऐरे भी अनुक्रम नहीं है http://www.scala-lang.org/api/current/index.html#scala.Array, इसलिए इसके लिए कुछ (शायद निहित) पुनर्निर्देशन। – Basilevs

73

से Programming Scala:

Array(1,2,4,5).sameElements(Array(1,2,4,5)) 
+3

मुझे लगता है कि यह सही समाधान है, भले ही दूसरा स्वीकार्य है। –

+0

यह वह था जिसने मेरे फ्रीस्पेक परीक्षण को पारित करने में मदद की। :-) –

0

सर्वश्रेष्ठ प्रदर्शन के लिए आप का उपयोग करना चाहिए:

java.util.Arrays.equals(a, b) 

यह बहुत तेजी से है और अतिरिक्त वस्तु आवंटन की आवश्यकता नहीं है। स्कैला में Array[T] जावा में Object[] जैसा ही है। Int जैसे प्राचीन मूल्यों के लिए वही कहानी जो जावा int है।