কিভাবে রুবিতে একটি হ্যাশ পুনরাবৃত্তি একটি নির্দিষ্ট আউটপুট পেতে?


218

আমি একটি রুবি হ্যাশ পুনরাবৃত্তি একটি নির্দিষ্ট আউটপুট পেতে চাই।

এটি হ্যাশ আমি পুনরাবৃত্তি করতে চান:

hash = {
  1 => ['a', 'b'], 
  2 => ['c'], 
  3 => ['d', 'e', 'f', 'g'], 
  4 => ['h']
}

এই ফলাফলটি আমি পেতে চাই:

1-----

a

b

2-----

c

3-----

d 

e

f

g

4-----

h

রুবিতে, আমি কীভাবে আমার হ্যাশের সাথে এই জাতীয় আউটপুট পেতে পারি?


3
যদি আপনি কোনও হ্যাশ পুনরাবৃত্তি করে এবং এটি অর্ডার হওয়ার প্রত্যাশা করে থাকেন তবে আপনাকে সম্ভবত অন্য কোনও সংগ্রহের ধরণ ব্যবহার করতে হবে
— অ্যালেন রাইস

আমি কি রেডিও বোতাম বিকল্প হিসাবে হ্যাশ মানগুলি পাস করতে পারি ??
— অষ্টম

রেডিও বোতাম বিকল্প হিসাবে হ্যাশ পাস করছি .. তবে প্রথম বিকল্পের জন্য রেডিও বোতামটি পাচ্ছি, অন্যান্য মানগুলির জন্য এটি পাচ্ছে না।
— এসটিএস

1
@ অ্যালেন: রুবি ১.৯-এ হ্যাশগুলি অর্ডার করা হয়েছে। আপনি রুবির <1.9 এ থাকলে কারাগুলি অর্ডারহ্যাশও সরবরাহ করে (এটি কেবল অল্প পরিমাণে ব্যবহার করে)। দেখুন culann.com/2008/01/rails-goodies-activesupportorderedhash
— জেমস এ রোসেন

উত্তর:


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

অর্ডার সম্পর্কে আমার যোগ করা উচিত, যে 1.8-এ আইটেমগুলি এলোমেলোভাবে ক্রমান্বিত হবে (ভাল, আসলে ফিক্সনমের হ্যাশিং ফাংশন দ্বারা সংজ্ঞায়িত ক্রমে), যখন 1.9 এ এটি আক্ষরিক ক্রমে পুনরাবৃত্তি হবে।


1
এখানে কি যদি কোথাও ব্যবহার না করা হয়? । আমাদের কি ?কিয়ের জায়গায় রাখা দরকার ? উদাহরণস্বরূপ: |?, array|এই বৈধ বাক্য গঠন?
— হুজেফা বিয়াওয়ালাওয়ালা

1
@ হুজেফবিবিয়ারওয়ালা নো, রুবির কোনও ?বৈধ পরিবর্তনীয় নাম নয়। আপনি ব্যবহার করতে পারেন _, কিন্তু আপনার প্রয়োজন নেই।
— sepp2k

2
@ খুজেবাবিয়াওয়ারওয়ালা হ্যাঁ, আপনি লিখতে পারেন|_, v|
— sepp2k

1
ভি বা মানের পরিবর্তে ভেরিয়েবল নামের অ্যারেটি কী ব্যবহার করবেন?
— জুনিক্স

1
@ জ্রিক্স কারণ ওপিতে একটি হ্যাশ রয়েছে যার মানগুলি অ্যারে।
— রেডন রোসবারো

85

হ্যাশ দিয়ে পুনরাবৃত্তি করার সবচেয়ে প্রাথমিক উপায়টি হ'ল:

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

হ্যাঁ এটি বোঝা যায়। @ Sepp2k এর উত্তরটির কীতে # {? রয়েছে?
— প্রতিশ্রুতিবদ্ধ 23

ওহ কিছু মনে করো না. আমি দেখেছি যে এটি স্ট্রিং ইন্টারপোলেশনটির জন্য ছিল
— প্রতিশ্রুতিবদ্ধ


18

একটি হ্যাশের উপর সাজানো কলিং এটিকে নেস্টেড অ্যারেগুলিতে রূপান্তর করে এবং তারপরে কী দ্বারা বাছাই করে, তাই আপনার যা দরকার তা হ'ল:

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

এবং যদি আপনার আসলে "----" অংশের প্রয়োজন না হয় তবে এটি কেবলমাত্র হতে পারে:

puts h.sort

হ্যাশ কীগুলি সংখ্যা, তাই '[কে + "----"]' একটি টাইপআরার উত্থাপন করে (স্ট্রিং ফিক্সনামে জোর করা যায় না)। আপনার দরকার '[k.to_s + "----"]'
— গ্লেন জ্যাকম্যান

যথেষ্ট সত্য। আমার পরীক্ষার সংস্করণে আমার চিঠি ছিল। স্থির, আরও উন্নত "# {কে} ----" ব্যবহার করে।
— গ্লেন এমসিডোনাল্ড


1

আপনি পুনরায় পরিমার্জন করতে পারেন Hash::eachযাতে এটি পুনরাবৃত্ত গণনার পক্ষে সহায়তা করবে । ব্লক এবং গণক সমর্থন সহ আমার Hash::each( Hash::each_pair) এর সংস্করণটি এখানে :

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

এখানে ব্যবহার দ্বারা উদাহরণ কয়েক Hash::eachসঙ্গে এবং ছাড়া recursiveপতাকা:

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!) এখানে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.