web-dev-qa-db-ja.com

ネストされたハッシュから特定の要素を削除する

ネストされたハッシュを使用しようとしています。私は次のように表されるカードのデッキを持っています:

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

私の目標は、特定のカードを1枚デッキから取り除き、その特定のカードなしでカードのデッキを戻すことができるようにすることです。誰かがハッシュを繰り返して、2つのクラブのようなカードを削除する方法について私を助けることができますか?

deck_of_cards[:two][:clubs]

このコードは一連のカードを削除するために機能しますが、特定のカードを削除する方法がわかりません

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

これを行うだけです:

deck_of_cards[:clubs].delete(:two)
26
texasbruce

このようなタップ関数を使用して、要素を削除して元のハッシュを返すこともできます

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

これは:twoキーなしでdeck_if_cardsハッシュを返します

あなたも一行でそれを行うことができます

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

ハッシュ内にハッシュがあるので、これを行うことができます:

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

eachを使用してキーと値を反復処理し、ブロック内で条件を作成して、内部ハッシュの特定の値を削除します。

1
MurifoX

使用する .tap

deck_of_cards.tap{ |deck_of_cards| deck_of_cards[:hearts].delete(:two) }
#=> { 
#     :hearts=>{: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} 
#   }

削除された値だけでなく、完全なハッシュをエレガントな方法で返すという利点があります。

1
Joshua Pinter

あなたはこのようなものでなければならないでしょう:

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
0
robbrit

私はこの方法があなたのために仕事をするだろうと思います

def nested_delete(card:, deck:)
  each do |hash_key, hash_value|
    if hash_key.to_s.eql?(deck)
      self[hash_key].delete(card.to_sym)
    end
  end
  self
end

デッキ「ハート」からカード「6」を削除したいとします。あなたがする必要があるのは

deck_of_cards.nested_delete(card: 'six', deck: 'hearts')
0
Ramesh RV