2012-10-20 84 views
2

這是一個岩石紙剪刀遊戲。 game.class表示這是一個數組。我希望找到贏得比賽的人的名字(這裏是Player2)。如何從數組中構建散列

遊戲= [[ 「PLAYER1」, 「P」],[ 「Player2」, 「S」]]

,想到的方法是使用名稱值返回一個散列分開。然後通過值來搜索該散列以獲取玩家名稱。

h = Hash.new(0) 
game.collect do |f| 
    h[f] = f[1] 
end 
h 
#=> {["Player1", "P"]=>"P", ["Player2", "S"]=>"S"} 

這是接近但沒有雪茄。我想

{"Player1" => "P", "Player2" => "S"} 

我用注射方法再次嘗試:

game.flatten.inject({}) do |player, tactic| 
    player[tactic] = tactic 
    player 
end 
#=> {"Player1"=>"Player1", "P"=>"P", "Player2"=>"Player2", "S"=>"S"} 

這不起作用:

Hash[game.map {|i| [i(0), i(1)] }] 
#=> NoMethodError: undefined method `i' for main:Object 

我將不勝感激一些指針的東西,會幫助我瞭解。

+0

相關:http://bugs.ruby-lang.org/issues/666 – tokland

回答

3

你可以簡單地這樣做了。

game = [["Player1", "P"], ["Player2", "S"]] 
#=> [["Player1", "P"], ["Player2", "S"]] 
Hash[game] 
#=> {"Player1"=>"P", "Player2"=>"S"} 
+0

聖牛!你能解釋那裏發生了什麼嗎? – sf2k

+0

我會在稍後再玩這個。謝謝 – sf2k

+0

謝謝,這真的簡化了思想。 – sf2k

2

用途:

game.inject({}){ |h, k| h[k[0]] = k[1]; h } 
+0

也有效!我必須弄清楚h [k [0]]在做什麼。 – sf2k

+0

我想我明白了,它實際上是對第一對項目的嵌套元素調用,然後鏈接到同一對中的第二項。這是一個公平的翻譯? – sf2k

+0

嗯....哦,對於遊戲中的每個元素,它構建了下一部分。我很高興我能入睡。謝謝 – sf2k

2

使用each_with_object意味着你不需要有兩個語句塊中,就像在xdazz的回答

game.each_with_object({}){ |h, k| h[k[0]] = k[1] } 

可以讓這個更可讀解構第二塊參數

game.each_with_object({}){ |hash, (name, tactic)| hash[name] = tactic } 
+0

這很有趣,謝謝。它有一個很好的可讀性 – sf2k

0

您可以使用Ruby內置的Array#to_h方法:

game.to_h 
#=> {"Player1"=>"P", "Player2"=>"S"}