2012-02-12 20 views
28

क्या कोई मूल्य की उपस्थिति के लिए स्लाइस/मानचित्रों की जांच करने का कोई तरीका है?जाओ: अनन्य

मैं एक टुकड़ा केवल अगर यह होता है नहीं टुकड़ा में मौजूद एक मूल्य जोड़ना चाहते हैं।

यह काम करता है, लेकिन यह वर्बोज़ लगता है। क्या ऐसा करने का कोई बेहतर तरीका है?

orgSlice := []int{1, 2, 3} 
newSlice := []int{} 
newInt := 2 

newSlice = append(newSlice, newInt) 
for _, v := range orgSlice { 
    if v != newInt { 
     newSlice = append(newSlice, v) 
    } 
} 

newSlice == [2 1 3] 
+1

पुन: संपादित करें - यह किसी वैध मानचित्र कुंजी प्रकार के लिए एक ही कहानी है - जो स्ट्रिंग है। – zzzz

+1

पुन: EDIT2 - यदि 'newSlice' में मानों का क्रम कोई फर्क नहीं पड़ता है और इसका उपयोग रेंज स्टेटमेंट का उपयोग करके किया जाएगा/उसका उपभोग किया जाएगा, तो इसका निर्माण अनावश्यक है - बस 'सेट' की चाबियाँ रेंज करें। – zzzz

+0

@jnml आपकी टिप्पणियों के लिए धन्यवाद। मैं जीएई डेटास्टोर में 'इनट्स' की सूची संग्रहित कर रहा हूं और पूछताछ के उद्देश्य के लिए यह एक टुकड़ा होना चाहिए ('[] int')। क्या यह आवश्यकता मेरी प्रारंभिक तकनीक को बेहतर विकल्प बनाती है? सूचियां छोटी होंगी। –

उत्तर

46

आपका दृष्टिकोण प्रत्येक सम्मिलन के लिए रैखिक समय लेगा। map[int]struct{} का उपयोग करने का एक बेहतर तरीका होगा। वैकल्पिक रूप से, आप map[int]bool या कुछ समान का उपयोग भी कर सकते हैं, लेकिन खाली struct{} का लाभ यह है कि यह किसी भी अतिरिक्त स्थान पर कब्जा नहीं करता है। इसलिए map[int]struct{} पूर्णांक के सेट के लिए एक लोकप्रिय विकल्प है।

उदाहरण:

set := make(map[int]struct{}) 
set[1] = struct{}{} 
set[2] = struct{}{} 
set[1] = struct{}{} 
// ... 

for key := range(set) { 
    fmt.Println(key) 
} 
// each value will be printed only once, in no particular order 


// you can use the ,ok idiom to check for existing keys 
if _, ok := set[1]; ok { 
    fmt.Println("element found") 
} else { 
    fmt.Println("element not found") 
} 
+0

आपके उत्तर के लिए धन्यवाद। कुछ सवाल: फिर आप स्लाइस को फिर से कैसे बनाएंगे? क्या इस रणनीति को तारों के साथ काम करने का कोई तरीका है? क्षमा करें अगर ये स्पष्ट हैं - मैं जाने के लिए नया हूं। –

+3

मैं गणना के दौरान केवल मानचित्र का उपयोग करूंगा (क्योंकि इसमें ओ (एन) के बजाय ओ (1) व्यवहार है)। उसके बाद, आप एक टुकड़ा बना सकते हैं और मानचित्र से प्रत्येक मान की प्रतिलिपि बना सकते हैं। इसके बाद तत्वों के पास यादृच्छिक क्रम होगा, इसलिए आप इसे सॉर्ट करना चाहेंगे।और आप नक्शा कुंजी के रूप में int, float, struct, string, और arrays का उपयोग कर सकते हैं (कम से कम Go1 में)। – tux21b

+0

विशेष रूप से रेखांकित करने के लिए धन्यवाद कि खाली structs अतिरिक्त जगह नहीं लेते हैं। मुझे यह नहीं पता था और मैप [टाइप] इंटरफ़ेस {} का उपयोग करेगा और इंटरफ़ेस को शून्य सौंपेगा। – user1943442

22

सबसे कुशल होने की संभावना है टुकड़ा से अधिक पुनरावृत्ति होने के लिए और अगर आप इसे नहीं पाते जोड़कर।

func AppendIfMissing(slice []int, i int) []int { 
    for _, ele := range slice { 
     if ele == i { 
      return slice 
     } 
    } 
    return append(slice, i) 
} 

यह सरल और स्पष्ट है और छोटी सूचियों के लिए तेज़ होगा।

आगे, यह हमेशा आपके वर्तमान मानचित्र-आधारित समाधान से तेज़ होगा। मानचित्र-आधारित समाधान पूरे टुकड़े पर फिर से शुरू होता है चाहे कोई फर्क नहीं पड़ता; यह समाधान तत्काल लौटाता है जब यह पता चलता है कि नया मान पहले से मौजूद है। दोनों समाधान तत्वों की तुलना करते हैं जैसे वे पुनरावृत्त होते हैं। (प्रत्येक नक्शा असाइनमेंट कथन निश्चित रूप से कम से कम एक नक्शा कुंजी तुलना आंतरिक रूप से करता है।) एक मानचित्र केवल तभी उपयोगी होगा यदि आप इसे कई प्रविष्टियों में बनाए रख सकें। यदि आप इसे प्रत्येक प्रविष्टि पर पुनर्निर्माण करते हैं, तो सभी लाभ खो जाते हैं।

यदि आपको वास्तव में बड़ी सूचियों को कुशलतापूर्वक संभालने की आवश्यकता है, तो क्रमबद्ध क्रम में सूचियों को बनाए रखने पर विचार करें। (मुझे संदेह है कि आदेश आपके लिए कोई फर्क नहीं पड़ता क्योंकि आपका पहला समाधान सूची की शुरुआत में जोड़ा गया है और आपका नवीनतम समाधान अंत में संलग्न होता है।) यदि आप हमेशा सूचियों को क्रमबद्ध रखते हैं तो आप इस प्रकार का उपयोग कर सकते हैं। खोज फ़ंक्शन कुशल बाइनरी सम्मिलन करें।

+8

"मानचित्र-आधारित समाधान पूरे टुकड़े पर फिर से शुरू होता है चाहे कोई फर्क नहीं पड़ता" - क्या आप वाकई हैश-नक्शा काम करते हैं? – Ottokar

+0

@ ओटोकर, क्या वह गलत है? बहुत से लोग उग्र हो गए लेकिन कोई प्रतिक्रिया नहीं छोड़ी गई। –

+1

@ फिलिप बार्टुज़ी वास्तव में, मुझे लगता है कि मैंने उस कथन के अर्थ को गलत समझा होगा। हैश-मैप्स स्पष्ट रूप से कुंजी खोजने के लिए तत्वों पर पुनरावृत्ति नहीं करते हैं, लेकिन "नक्शा-आधारित समाधान" को "अद्वितीय होने पर टुकड़ा करने के लिए संलग्न" करने के लिए इसका लाभ होता है यदि हमें टुकड़ा को मानचित्र में परिवर्तित करना है और फिर नक्शा वापस टुकड़ा करना है । – Ottokar

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