2009-08-04 17 views
184

मेरे पास इस तरह हैश है:रूबी में हैश पर कैसे पुनरावृत्ति करें?

{ 
1=>["a", "b"], 
2=>["c"], 
3=>["a", "d", "f", "g"], 
4=>["q"] 
} 

इस तरह आउटपुट प्राप्त करने के लिए मैं इसे कैसे पुन: सक्रिय कर सकता हूं:

1----- 

a 

b 

2----- 

c 

3----- 

a 

d 

f 

g 
+3

यदि आप हैश को पुन: सक्रिय कर रहे हैं और इसे ऑर्डर करने की उम्मीद कर रहे हैं, तो आपको शायद कुछ अन्य संग्रह प्रकार –

+0

का उपयोग करने की आवश्यकता है, क्या मैं हैश मान को रेडियो बटन विकल्प के रूप में पास कर सकता हूं ?? – sts

+0

हैश को रेडियो बटन विकल्प के रूप में पास कर रहा है .. लेकिन पहले विकल्प के लिए रेडियो बटन प्राप्त हो रहा है, अन्य मानों के लिए इसे प्राप्त नहीं हो रहा है। – sts

उत्तर

280
hash.each do |key, array| 
    puts "#{key}-----" 
    puts array 
end 

आदेश मैं जोड़ने चाहिए के बारे में, 1.8 मदों में है कि यादृच्छिक क्रम में पुनरावृत्त किया जाएगा (ठीक है, वास्तव में फिक्सनम के हैशिंग फ़ंक्शन द्वारा परिभाषित आदेश में), जबकि 1.9 में इसे शाब्दिक के क्रम में पुनरावृत्त किया जाएगा।

+1

यहां देखें कि क्या कुंजी कहीं भी उपयोग नहीं की जाती है? । क्या हमें कुंजी के स्थान पर '' 'रखना होगा? पूर्व: '| ?, सरणी | 'यह वैध वाक्यविन्यास है? –

+0

@huzefabiyawarwala नहीं, '?' रूबी में मान्य चर नाम नहीं है। आप '_' का उपयोग कर सकते हैं, लेकिन आपको * की आवश्यकता नहीं है *। – sepp2k

+0

मेरा मतलब था कि अगर हम हैश पर पुनरावृत्ति के लिए '| के, वी |' का उपयोग करते हैं, लेकिन हम अपने लूप के अंदर हमारे तर्क कार्यान्वयन में 'के' का उपयोग नहीं करते हैं, तो क्या कोई तरीका है कि हम इस तरह लिख सकते हैं। _, वी | '? –

47
hash.keys.sort.each do |key| 
    puts "#{key}-----" 
    hash[key].each { |val| puts val } 
end 
16

एक हैश पर तरह कॉलिंग नेस्ट सरणियों में परिवर्तित कर और फिर कुंजी द्वारा उन्हें सॉर्ट करता है, तो आप सभी की जरूरत यह है:

puts h.sort.map {|k,v| ["#{k}----"] + v} 

और वास्तव में जरूरत है अगर तुम नहीं "- - "हिस्सा है, यह सिर्फ किया जा सकता है:

puts h.sort 
+0

हैश कुंजी संख्याएं हैं, इसलिए '[के + "----"]' टाइप टाइपर बढ़ाता है (स्ट्रिंग को फिक्सनम में घुमाया नहीं जा सकता है)।आपको '[k.to_s + "----"]' –

+0

पर्याप्त है। मेरे पास मेरे टेस्ट संस्करण में पत्र थे। फिक्स्ड, यहां तक ​​कि बेहतर "# {k} ----" का उपयोग कर। –

+0

निश्चित रूप से सूचीबद्ध लोगों का सबसे अच्छा जवाब निश्चित रूप से सूचीबद्ध है। –

67

एक हैश से अधिक पुनरावृति करने के लिए सबसे बुनियादी तरीका है इस प्रकार है:

hash.each do |key, value| 
    puts key 
    puts value 
end 
0

आप Hash::each परिष्कृत भी कर सकते हैं, इसलिए यह रिकर्सिव गणना का समर्थन करेगा।

module HashRecursive 
    refine Hash do 
     def each(recursive=false, &block) 
      if recursive 
       Enumerator.new do |yielder| 
        self.map do |key, value| 
         value.each(recursive=true).map{ |key_next, value_next| yielder << [[key, key_next].flatten, value_next] } if value.is_a?(Hash) 
         yielder << [[key], value] 
        end 
       end.entries.each(&block) 
      else 
       super(&block) 
      end 
     end 
     alias_method(:each_pair, :each) 
    end 
end 

using HashRecursive 

यहाँ उपयोग उदाहरण के साथ और recursive झंडा बिना Hash::each की:: यहाँ ब्लॉक और प्रगणक समर्थन के साथ Hash::each (Hash::each_pair) के अपने संस्करण है

hash = { 
    :a => { 
     :b => { 
      :c => 1, 
      :d => [2, 3, 4] 
     }, 
     :e => 5 
    }, 
    :f => 6 
} 

p hash.each, hash.each {}, hash.each.size 
# #<Enumerator: {:a=>{:b=>{:c=>1, :d=>[2, 3, 4]}, :e=>5}, :f=>6}:each> 
# {:a=>{:b=>{:c=>1, :d=>[2, 3, 4]}, :e=>5}, :f=>6} 
# 2 

p hash.each(true), hash.each(true) {}, hash.each(true).size 
# #<Enumerator: [[[:a, :b, :c], 1], [[:a, :b, :d], [2, 3, 4]], [[:a, :b], {:c=>1, :d=>[2, 3, 4]}], [[:a, :e], 5], [[:a], {:b=>{:c=>1, :d=>[2, 3, 4]}, :e=>5}], [[:f], 6]]:each> 
# [[[:a, :b, :c], 1], [[:a, :b, :d], [2, 3, 4]], [[:a, :b], {:c=>1, :d=>[2, 3, 4]}], [[:a, :e], 5], [[:a], {:b=>{:c=>1, :d=>[2, 3, 4]}, :e=>5}], [[:f], 6]] 
# 6 

hash.each do |key, value| 
    puts "#{key} => #{value}" 
end 
# a => {:b=>{:c=>1, :d=>[2, 3, 4]}, :e=>5} 
# f => 6 

hash.each(true) do |key, value| 
    puts "#{key} => #{value}" 
end 
# [:a, :b, :c] => 1 
# [:a, :b, :d] => [2, 3, 4] 
# [:a, :b] => {:c=>1, :d=>[2, 3, 4]} 
# [:a, :e] => 5 
# [:a] => {:b=>{:c=>1, :d=>[2, 3, 4]}, :e=>5} 
# [:f] => 6 

hash.each_pair(recursive=true) do |key, value| 
    puts "#{key} => #{value}" unless value.is_a?(Hash) 
end 
# [:a, :b, :c] => 1 
# [:a, :b, :d] => [2, 3, 4] 
# [:a, :e] => 5 
# [:f] => 6 

यहाँ उदाहरण है प्रश्न से ही:

hash = { 
    1 => ["a", "b"], 
    2 => ["c"], 
    3 => ["a", "d", "f", "g"], 
    4 => ["q"] 
} 

hash.each(recursive=false) do |key, value| 
    puts "#{key} => #{value}" 
end 
# 1 => ["a", "b"] 
# 2 => ["c"] 
# 3 => ["a", "d", "f", "g"] 
# 4 => ["q"] 

Hash::merge (Hash::merge!) here के मेरे रिकर्सिव संस्करण पर भी नज़र डालें।

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