2017-05-27 115 views
-3

因此,在基本Ruby中,我試圖弄清楚如何將字符串轉換爲散列或將字符串放入散列。我想要pokemon項目作爲鍵和值的整數。如何將字符串轉換爲散列或將其添加到散列

事情是這樣的:

hash = {} 
pokemon_list = "pikachu charizard jigglypuff bulbasaur" 

def create_poke_list(string) 
    hash << string.split 
end 
create_poke_list 

預期輸出:

hash 
#=> {"pikachu"=>0, "charizard"=>0, "jigglypuff"=>0, "bulbasaur"=>0} 
+2

你對「皮卡丘charizard jigglypuff bulbasaur」字符串有什麼期望? – MikDiet

+2

請編輯您的問題,以顯示給定字符串「pokemon_list」所需的返回值(散列)。 –

回答

3
pokemon_list.split.product([0]).to_h 
    #=> {"pikachu"=>0, "charizard"=>0, "jigglypuff"=>0, "bulbasaur"=>0} 

步驟:

a = pokemon_list.split 
    #=> ["pikachu", "charizard", "jigglypuff", "bulbasaur"] 
b = a.product([0]) 
    #=> [["pikachu", 0], ["charizard", 0], ["jigglypuff", 0], ["bulbasaur", 0]] 
b.to_h 
    #=> <hash shown above> 

或者,

Hash[pokemon_list.split.product([0])] 

這裏Array#product只是一個pokeman_list.zip(a)其中a是由pokenman_list.size相等的元素,這裏零陣列速記形式。另請參閱Enumerable#zip

或使用String#gsub

這是另一種不需要將字符串轉換爲數組的方式。

pokemon_list.gsub(/[[:alpha:]]+/).with_object({}) { |w,h| h[w] = 0 } 
    #=> {"pikachu"=>0, "charizard"=>0, "jigglypuff"=>0, "bulbasaur"=>0} 

這工作,因爲gsub當不使用塊執行返回一個枚舉。無可否認這是該方法的一種不尋常用法(因爲它不能替換字符串中的字符),但有時候我發現它很有用。

+1

我認爲這是一個很好的答案,但它需要解釋爲什麼#產品比「Hash.new(0)」更有意義。你和我知道它爲什麼有效,但#產品對於大多數人來說是一種非直觀的選擇。 :) –

+0

@CodeGnome,感謝您的建議。我做了一個編輯,但我沒有看到'Hash.new(0)'是如何被用來獲得優勢的。 –

0

如果您需要被初始化爲0默認值的哈希值,你可以簡單地做

hash = Hash.new(0) 
p hash["pikachu"] 
#=> 0