2012-11-30 11 views
27

मैं दो हैश है में एक और हैश के साथ एक हैश गठबंधन करने के लिए ...कैसे माणिक

a = {:a => 5} 
b = {:b => 10} 

मैं चाहता हूँ ...

c = {:a => 5,:b => 10} 

मैं हैश ग कैसे बनाऊं?

+0

बस में आईआरबी – thefonso

+0

1.9.3p194 यह मिल गया का उपयोग कर इस

people = person1.merge(person2) {|key, old, new| old} Output: {"name"=>"MarkZuckerberg", "company_name"=>"Facebook", "job"=>"CEO", "position"=>"Chairman"} 

की तरह कुछ कर सकते हैं {: एक => 5} = > {: a => 5} 1.9.3p194: 002> हैश 2 = {: बी => 10} => {: बी => 10} 1.9.3p194: 003> हैश 3 = हैश 1.मेरगे (हैश 2) => {: ए => 5,: बी => 10} 1.9.3p194: 004> हैश 3 => {: ए => 5,: बी => 10} 1.9.3p194: 005> – thefonso

उत्तर

51

यह एक सुंदर सीधी-सपाट आपरेशन अगर आप सिर्फ interleaving रहे हैं:

c = a.merge(b) 

आप वास्तव में एक साथ मान जोड़ने के लिए चाहते हैं, यह थोड़ा जटिल काम है, लेकिन असंभव नहीं होगा:

c = a.dup 
b.each do |k, v| 
    c[k] ||= 0 
    c[k] += v 
end 

a.dup का कारण a हैश में मानों को उलझाने से बचने के लिए है, लेकिन यदि आपको परवाह नहीं है तो आप उस भाग को छोड़ सकते हैं। ||= का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि यह 0 के डिफ़ॉल्ट से शुरू होता है nil + 1 मान्य नहीं है।

19

पर डॉक्स की जाँच कर सकते हैं कि हर कोई आप को हल करने के मर्ज विधि का उपयोग कर सकते हैं कह रहा है के रूप में अपने मुसीबत। हालांकि मर्ज विधि का उपयोग करने में कुछ समस्या है। यही कारण है कि।

person1 = {"name" => "MarkZuckerberg", "company_name" => "Facebook", "job" => "CEO"} 

person2 = {"name" => "BillGates", "company_name" => "Microsoft", "position" => "Chairman"} 

इन दो फ़ील्ड नाम और company_name पर एक नज़र डालें। यहां नाम और company_name दोनों हैंश में हैं (मेरा मतलब चाबियाँ हैं)। अगली नौकरी और स्थिति में अलग-अलग कुंजी हैं।

जब आप दो हैश व्यक्ति 1 और व्यक्ति 2 को मर्ज करने का प्रयास करते हैं यदि व्यक्ति 1 और व्यक्ति 2 कुंजी समान हैं? तो व्यक्ति 2 कुंजी मान peron1 कुंजी मान ओवरराइड करेगा। यहां दूसरा हैश पहले हैश फ़ील्ड को ओवरराइड करेगा क्योंकि दोनों एक जैसे हैं। यहां नाम और कंपनी का नाम समान है। परिणाम देखें।

people = person1.merge(person2) 

Output: {"name"=>"BillGates", "company_name"=>"Microsoft", 
     "job"=>"CEO", "position"=>"Chairman"} 

हालांकि यदि आप अपने दूसरे हैश को पहले हैश को ओवरराइड नहीं करना चाहते हैं। 001> hash1 =: आप यह बस एक त्वरित सूचना है जब विलय()

+1

सहित (अधिक) आपके पुनः में विलय की पूर्ण कार्यक्षमता प्रायोजक! :) +1 – Zackkenyon

+0

आप आज के लिए मेरे नायक हैं। मैं इसे बिल्कुल देख रहा था। –

+0

टकराव पर विचार करना महत्वपूर्ण है! लेकिन आपका समाधान 'people = person2.merge (person1)' जैसा ही है, है ना?इस मामले में ब्लॉक अनावश्यक है, लेकिन अगर आप टकराव के लिए कुछ और जटिल करना चाहते हैं तो यह उपयोगी है। यह 'विलय!' (विनाशकारी संस्करण) के लिए भी उपयोगी है। –