2012-06-20 3 views
11

J'essaie de travailler avec un hachage imbriqué. J'ai un jeu de cartes représentées comme suit:Suppression d'un élément spécifique d'un hachage imbriqué

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} 
} 

Mon objectif est d'être en mesure de retirer une carte spécifique de la plate-forme et remettre le jeu de cartes sans cette carte spécifique. Est-ce que quelqu'un pourrait m'aider à parcourir le hachage et à retirer une carte comme les deux clubs?

deck_of_cards[:two][:clubs] 

Ce code fonctionne pour enlever un costume de cartes, mais je ne peux pas savoir comment retirer une carte spécifique

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

Toute aide est appréciée.

Répondre

21

Il suffit de faire ceci:

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

Un moyen de récupérer le nouvel élément entièrement? Parce que ce code renvoie l'élément supprimé. – sidney

1

Vous avez un hachage dans un hachage, de sorte que vous pouvez faire ceci:

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

Vous utilisez each pour parcourir les clés et les valeurs, et faire une condition à l'intérieur du bloc pour supprimer la valeur spécifique à l'intérieur hacher.

+0

Solution sous-estimée! –

+0

Pourquoi devriez-vous itérer le hachage lorsque vous pouvez accéder au subhash à l'aide de la clé? – Bustikiller

0

Vous auriez à est quelque chose comme ceci:

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 

Il pourrait être préférable de représenter votre plate-forme comme un tableau de paires, comme ceci:

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

Ensuite, vous pouvez simplement aller:

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

Vous pouvez supprimer un élément et renvoyer le hachage d'origine également en utilisant la fonction du robinet comme celui-ci

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

ce retourne le hachage de deck_if_cards sans: deux clés

vous pouvez le faire en une ligne aussi

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