23

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

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

7 に答える 7

40

これを行うだけです:

deck_of_cards[:clubs].delete(:two)
于 2012-06-20T18:02:46.107 に答える
0

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

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

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

于 2012-06-20T17:59:37.567 に答える
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
于 2012-06-20T18:01:41.700 に答える
0

この懸念事項をアプリのイニシャライザとして記述delete_nested_keyし、Hash オブジェクトに呼び出されるメソッドを追加しました。ハッシュのネストされたキーを削除します。key_path を配列として渡す必要があります (削除するキーに移動するためにトラバースするキーのリストのみ)。

正常に動作しているように見えますが、書いたばかりなので、問題がある可能性があります。

class Hash
  module NestedKeyDeletion
    extend ActiveSupport::Concern

    included do
      def deleted_nested_key!(key_path)
        nested_hash = fetch_most_inner_hash(key_path)
        nested_hash.delete(key_path.last)

        self
      end

      private

      def fetch_most_inner_hash(key_path)
        nested_hash = self

        key_path.each_with_index do |key, index|
          return  nested_hash if index == key_path.size - 1
          nested_hash = nested_hash.fetch(key)
        end
      end
    end
  end
end

Hash.include(Hash::NestedKeyDeletion)

次に、次のように使用できます。

[1] pry(main)> x = { x: { y: 2} }
=> {:x=>{:y=>2}}
[2] pry(main)> x.deleted_nested_key!([:x, :y])
=> {:x=>{}}
[3] pry(main)>

よろしく、ダニエル。

于 2021-06-22T14:23:23.223 に答える