2012-06-09 128 views
1

如何將輸入推送到散列值?我的問題是我得到了多個鍵,並且他們都引用了數組。散列值的數組

{"A"=>["C"], "B"=>["E"], "C"=>["D"], "D"=>["B"]} 

如何將另一個字符串推到其中之一上?例如,我想添加一個"Z"到密鑰"A"的數組?

目前我要麼覆蓋前面的數組,要麼所有的數據都在一個。

它關於將數組["AB3", "DC2", "FG4", "AC1", "AF4"]轉換爲{"A"=>["B", "C", "F"]}的散列。

回答

1

任何命令<<, push, unshift會做一份工作

if h["A"] 
    h["A"] << "Z" 
else 
    h["A"] = ["Z"] 
end 
+0

它不這樣工作。問題是沒有數組推入當前「未定義的方法」<<「爲零:NilClass」 我的代碼 '計數器在0 ..($ graph.size)-1做 #Key wird erstellt temp_start = $圖表[計數器] [0,1] temp_finish = $圖表[計數器] [1,1] 放temp_start 看跌temp_finish $ routen [temp_start] << temp_finish 端 end' – user1446375

+0

然後只是檢查價值的存在 –

+0

非常感謝你!我完全是新的編程和紅寶石,所以我沒有來這個簡單的解決方案:) – user1446375

0

你說你原來的問題是在陣列["AB3", "DC2", "FG4", "AC1", "AF4"]轉換成散列{"A"=>["B", "C", "F"]},它可以這樣做:

Hash[a.group_by { |s| s[0] }.map { |k, v| [k, v.map { |s| s[1] }] }] 

或者這樣:

a.inject(Hash.new{|h, k| h[k]=[]}) { |h, s| h[s[0]] << s[1] ; h } 

請注意Hash.new{|h, k| h[k]=[]}創建一個默認值爲[](空數組)的數組,因此您將始終可以使用<<向其添加元素。

0

更好的方法:

在哈希添加一個新的類方法如下:

class Hash 
    def add (k,v) 
    unless self.key?k 
     self[k] = [v] 
    else 
     self[k] = self[k] << v 
    end 
    self 
    end 
end 


h={} 
h.add('A','B') #=> {"A"=>["B"]} 
h.add('A','C') #=> {"A"=>["B", "C"]} 
h.add('B','X') #=> {"A"=>["B", "C"], "B"=>["X"]} 

完成。

根據您的確切問題,這可能更具慣用性;比如說,你想要一次發送多個值,那麼代碼可以被DRY-ed來處理多個參數。

希望這會有所幫助。

一切順利。