2012-06-20 11 views
11

से एक विशिष्ट तत्व को हटाने से मैं एक नेस्टेड हैश के साथ काम करने की कोशिश कर रहा हूं।नेस्टेड हैश

deck_of_cards = { 
:hearts => {:two => 2, :three => 3, :four => 4, :five => 5, :six => 6, :seven => 7, :eight => 8, :nine => 9, :ten => 10, :jack => 10, 
      :queen => 10, :king => 10, :ace => 11}, 
:spades => {:two => 2, :three => 3, :four => 4, :five => 5, :six => 6, :seven => 7, :eight => 8, :nine => 9, :ten => 10, :jack => 10, 
      :queen => 10, :king => 10, :ace => 11}, 
:clubs => {:two => 2, :three => 3, :four => 4, :five => 5, :six => 6, :seven => 7, :eight => 8, :nine => 9, :ten => 10, :jack => 10, 
      :queen => 10, :king => 10, :ace => 11}, 
:diamonds => {:two => 2, :three => 3, :four => 4, :five => 5, :six => 6, :seven => 7, :eight => 8, :nine => 9, :ten => 10, :jack => 10, 
      :queen => 10, :king => 10, :ace => 11} 
} 

मेरा लक्ष्य डेक से एक विशेष कार्ड को हटाने और उस विशिष्ट कार्ड के बिना कार्ड के डेक वापस जाने के लिए सक्षम होने के लिए है: मैं प्रतिनिधित्व किया ताश के पत्तों के रूप में निम्नानुसार है। क्या कोई भी हैश के माध्यम से पुन: प्रयास करने और क्लबों की तरह एक कार्ड को हटाने के तरीके में मेरी सहायता करने में सक्षम होगा?

deck_of_cards[:two][:clubs] 

इस कोड को ताश के पत्तों की एक सूट दूर करने के लिए काम करता है, लेकिन मैं यह पता लगाने नहीं कर सकते एक विशेष कार्ड

deck_of_cards.delete_if {|k, v| k == :spades} 

किसी भी मदद की सराहना की है निकालने का तरीका।

उत्तर

21

बस इस कार्य करें:

deck_of_cards[:clubs].delete(:two) 
+1

नया तत्व पूरी तरह से पुनर्प्राप्त करने का कोई तरीका? क्योंकि यह कोड हटाए गए तत्व को लौटाता है। – sidney

1

आप एक हैश के अंदर एक हैश है, तो आप ऐसा कर सकते हैं:

deck_of_cards.each {|k,v| v.delete(:two) if k == :clubs} 

आप each का उपयोग कुंजी और मूल्यों के माध्यम से पुनरावृति, और ब्लॉक के अंदर एक शर्त बनाने के लिए भीतरी पर विशेष मूल्य को हटाने के लिए हैश।

+0

Underrated समाधान! –

+0

जब आप कुंजी के माध्यम से सबहाश तक पहुंच सकते हैं तो आप हैश को फिर से क्यों शुरू करेंगे? – Bustikiller

0

आप के लिए होता है करने के लिए कुछ इस तरह है:

def remove_card deck, suit, number 
    # do a deep clone 
    new_deck = {} 
    deck.each { |k, v| new_deck[k] = v.dup } 

    # remove the card 
    new_deck[suit] = new_deck[suit].reject { |k, v| k == number } 

    new_deck 
end 

यह बेहतर हो सकता है इस तरह, जोड़े की एक सरणी के रूप में अपने डेक का प्रतिनिधित्व करने के लिए:

[ [:hearts, :two], [:hearts, :three], ... ] 

तो फिर तुम बस जाओ कर सकते हैं:

def remove_card deck, suit, number 
    deck.reject { |(s, n)| n == number and s == suit } 
end 
4

आपको कोई ऐसा तत्व को हटा दें और वापस कर सकते हैं मूल हैश भी इस

deck_of_cards.tap{|d| 
    d[:hearts].tap{|h| 
    h.delete(:two) 
    } 
} 

की तरह नल समारोह का उपयोग कर इस बिना deck_if_cards हैश वापस आ जाएगी: दो प्रमुख

आप भी एक पंक्ति में कर सकते हैं

deck_of_cards.tap{|d| d[:hearts].tap{|h| h.delete("two")}} 
संबंधित मुद्दे