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


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.