जाने में दो मानचित्रों का मिलन


82

मेरे पास एक पुनरावर्ती फ़ंक्शन है जो फ़ाइल पथों का प्रतिनिधित्व करने वाले ऑब्जेक्ट बनाता है (कुंजी पथ हैं और मान फ़ाइल के बारे में जानकारी हैं)। यह पुनरावर्ती है क्योंकि यह केवल फाइलों को संभालने के लिए है, इसलिए यदि एक निर्देशिका का सामना किया जाता है, तो फ़ंक्शन को पुन: पुन: निर्देशिका पर बुलाया जाता है।

कहा जा रहा है कि, मैं दो मानचित्रों पर एक सेट यूनियन के बराबर करना चाहता हूं (यानी "मुख्य" मानचित्र पुनरावर्ती कॉल से मूल्यों के साथ अद्यतन किया गया है)। क्या यह एक मुहावरेदार तरीका है कि इसे एक नक्शे से अलग करना और प्रत्येक कुंजी को असाइन करना, दूसरे मानचित्र में एक ही चीज़ के लिए इसका महत्व है?

यही कारण है: दिए गए a,bप्रकार के होते हैं map [string] *SomeObject, और aऔर b, अंततः भर जाती है वहाँ अद्यतन करने के लिए किसी भी तरह से है aसब में मूल्यों के साथ b?


2
शायद आप इस तरह के काम के लिए एक वास्तविक सेट कंटेनर का उपयोग कर सकते हैं: github.com/deckarep/golang-set
राल्फ कारेवो

राल्फ का सुझाव सेटों के लिए अच्छा है। हालांकि, मैं कहूंगा कि आपके मामले में यह इतना संघ नहीं है क्योंकि यह एक मर्ज है ; एक सेट सिर्फ "कुंजियों" का एक संग्रह होना चाहिए, जबकि आपके पास कुंजी-मूल्य जोड़े के दो संग्रह हैं, जहां एक "सेट" में दूसरे पर प्राथमिकता होनी चाहिए।
एनिसस

जवाबों:


133

इस तरह के मर्ज को करने के लिए न तो कोई तरीके से बनाया गया है और न ही मानक पैकेजों में कोई विधि।

अकर्मण्य तरीका केवल पुनरावृति करना है:

for k, v := range b {
    a[k] = v
}

5
ANisus ने जो उत्तर दिया उसे जोड़ने के लिए: मानचित्र अनिवार्य रूप से हैश टेबल हैं। संभवत: दोनों मानचित्रों की तुलना में दो मानचित्रों के मिलन की तुलना में तेजी से गणना करने का कोई तरीका नहीं है।
फज

आप शायद एक प्रकार-अज्ञेय संघ कार्य लिखने के लिए प्रतिबिंब का उपयोग कर सकते हैं, लेकिन यह धीमा होगा।
इवान

क्या यह कोड UNION को [k] और v को [k] को सौंपने से पहले नहीं होना चाहिए? क्या होगा अगर [k] और v सरणियाँ, या नक्शे हैं?
vdolez

2
वह नक्शों को मिलाना चाहता है, जरूरी नहीं कि वह नक्शों में ही हो। आप ऐसा कुछ करना चाहते हैं, तो आप सिर्फ परिवर्तन की जरूरत a[k] = vके लिए a[k] = a[k] + vइस तरह या कुछ और।
काइल

@ मुझे लगता है कि तुम सही हो। वास्तविक संघ के लिए , इसका उपयोग किया जा सकता है:a[k] = append(a[k], v...)
user3405291

2

आप नेस्टेड नक्शे की एक जोड़ी है, तो leftऔर right, तो इस समारोह रिकर्सिवली मदों से जोड़ देगा rightमें left। यदि कुंजी पहले से ही है, leftतो हम संरचना में गहरी पुनरावृत्ति करते हैं और केवल कुंजी जोड़ने का प्रयास करते हैंleft (जैसे कि उन्हें कभी भी प्रतिस्थापित न करें)।


type m = map[string]interface{}

// Given two maps, recursively merge right into left, NEVER replacing any key that already exists in left
func mergeKeys(left, right m) m {
    for key, rightVal := range right {
        if leftVal, present := left[key]; present {
            //then we don't want to replace it - recurse
            left[key] = mergeKeys(leftVal.(m), rightVal.(m))
        } else {
            // key not in left so we can just shove it in
            left[key] = rightVal
        }
    }
    return left
}

नोट: मैं उस मामले को नहीं संभालता जिसमें मूल्य स्वयं नहीं है map[string]interface{}। इसलिए यदि आपके पास left["x"] = 1और right["x"] = 2फिर उपरोक्त कोड प्रयास करने पर घबरा जाएगा leftVal.(m)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.