2013-09-01 10 views
15

मैं गो में दो सरणी की सही ढंग से तुलना कैसे कर सकता हूं?गो भाषा में सरणी की तुलना

उदाहरण के लिए, मैं int प्रविष्टियों, या किसी अन्य प्रकार के साथ दो आयामी सरणी की तुलना कैसे कर सकता हूं?

यह तुलना कितनी गहरी है?

+2

बस स्पष्ट करने के लिए, के बाद से लोगों को अक्सर यह गलती करते हैं - आप स्लाइस या सरणियों मतलब है? जाओ में एक अंतर है। यदि आप सुनिश्चित नहीं हैं कि आपका क्या मतलब है, तो क्या आप इन चीजों में से किसी एक को बनाने का कुछ उदाहरण कोड पेस्ट कर सकते हैं और हम इसे समझ लेंगे। – joshlf

+0

@ joshlf13 arrays स्लाइस नहीं। –

उत्तर

19

दो सरणी की तुलना करने के लिए comparison operators== या != का उपयोग करें। लिंक से उद्धरण:

सरणी मानों के मान तुलनीय हैं यदि सरणी तत्व प्रकार के मान तुलनीय हैं। दो सरणी मान बराबर हैं यदि उनके संबंधित तत्व बराबर हैं।

2 डी (या एनडी) सरणी उपर्युक्त आवश्यकता के अनुरूप फिट होने के साथ, आप इसकी तुलना उसी तरह से कर सकते हैं।

प्रश्न "यह तुलना कितनी गहरी है?" एरे के लिए समझ में नहीं आता है।

+10

नोप स्लाइस की तुलना केवल शून्य से की जा सकती है; http://play.golang.org/p/Kk8osjPm8n – Tom

+3

@ टॉम: आप किसी भी स्लाइस कहां देखते हैं? उनका सवाल कभी भी इस प्रश्न में नहीं किया गया है और न ही इस जवाब में। – zzzz

+6

@jnml यह सच है। यह सिर्फ इतना है कि बहुत से लोग भ्रमित हो जाते हैं क्योंकि गो [] int {1,2,3} एक टुकड़ा है लेकिन [3] int {1,2,3} एक सरणी है। – Tom

3

आप 2 int स्लाइस है/सरणियों इस प्रयास करें:

func IntArrayEquals(a []int, b []int) bool { 
    if len(a) != len(b) { 
     return false 
    } 
    for i, v := range a { 
     if v != b[i] { 
      return false 
     } 
    } 
    return true 
} 

नोट: इस -1 डी सरणियों के लिए है, लेकिन आप 2 डी के लिए यह पुनर्लेखन कर सकते हैं।

+4

धन्यवाद। क्या कोई अंतर्निहित कार्य है? –

+0

@angry_gopher बाइट्स। एक्वाल() –

12

"दीप" तुलना के लिए, आप reflect.DeepEqual का उपयोग कर सकते हैं।

गहरी समानता के लिए दीपईक्वल परीक्षण। यह सामान्य == समानता का उपयोग करता है जहां संभव हो लेकिन सरणी, स्लाइस, मानचित्र और structs के क्षेत्रों के तत्व स्कैन करेगा। मानचित्रों में, चाबियों की तुलना == के साथ की जाती है लेकिन तत्व गहरी समानता का उपयोग करते हैं। DeepEqual सही ढंग से पुनरावर्ती प्रकार संभालती है। कार्य केवल तभी होते हैं जब वे दोनों शून्य होते हैं। एक खाली टुकड़ा एक नील टुकड़ा के बराबर नहीं है।

उदाहरण:

package main 

import (
    "bytes" 
    "fmt" 
    "reflect" 
) 

func main() { 
    a := []byte{} // empty slice 
    b := []byte(nil) // nil slice 
    fmt.Printf("%t\n%t", bytes.Equal(a, b), reflect.DeepEqual(a, b)) 
} 

रिटर्न:

सच
झूठी

चेतावनी है कि यह धीमी है है।

Playground

+1

अतिरिक्त चेतावनी है कि दोनों सरणीओं को सटीक वही ऑर्डर करना पड़ता है। –

+1

@MaciejSzulik यह एक चेतावनी नहीं है, यह एक आवश्यकता है। सूचियों को सेट की तरह व्यवहार नहीं करना चाहिए। – ereOn

संबंधित मुद्दे