2012-06-20 3 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) 
당신이이없이 deck_if_cards 해시를 반환이

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

처럼 탭 기능을 사용하여 원래 해시 요소를 제거하고 반환 할 수 있습니다

+1

새로운 요소를 완전히 검색하는 방법은 없나요? 이 코드는 삭제 된 요소를 반환하기 때문에. – sidney

1

당신은 해시 내부 해시를 가지고, 그래서 당신은이 작업을 수행 할 수 있습니다

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

당신은 내부에 특정 값을 삭제 키와 값을 반복하고, 블록 내에서 조건을 만들기 위해 each를 사용 해시시.

+0

과소 평가 된 솔루션! –

+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")}}