2016-12-02 60 views
-1

我已經在陣列的下面陣列現在幾個小時和merge任何組合的眼前,selectfindmapflatten等的散列,具有還沒有能夠幫助我。如何計算數組的數組內的值到散列

我創建了一些醜陋的嵌套循環,但沒有接近Ruby方式。

我有數組的數組:

[ 
["Ja", nil, "Bijna", nil, "Ja"], 
["Nee", nil, "Nee", "Ja", "Nee"], 
[nil, nil, "Bijna", "Nee", "Nee"], 
["Ja", nil, nil, "Nee", "Ja"], 
["Bijna", nil, "Bijna", "Nee", "Ja"] 
] 

我需要垂直計數的值的所有實例,產生散列這樣的哈希:

{ 
{"Ja" => 2, "Nee" => 2, => "Bijna" => 1, "nil" => 1}, 
{"Ja" => 0, "Nee" => 0, => "Bijna" => 0, "nil" => 5}, 
{"Ja" => 0, "Nee" => 1, => "Bijna" => 3, "nil" => 1}, 
{"Ja" => 0, "Nee" => 1, => "Bijna" => 3, "nil" => 1}, 
{"Ja" => 3, "Nee" => 2, => "Bijna" => 0, "nil" => 0} 
} 

請注意,每個水平在散列中是數組中垂直的數量。

屈服(陣列)陣列的一個新的數組也是可以接受的,但我喜歡的哈希更好:

[ 
[["Ja", 2], ["Nee", 2], ["Bijna", 1], ["nil", 1]], 
[[etc]] 
] 
+1

歡迎來到SO。請閱讀「[問]」和「[mcve]」,以及http://meta.stackoverflow.com/q/261592/128421。看起來您要求我們爲您編寫代碼,因爲您沒有向我們展示您嘗試過的以及它出了什麼問題。我們最好看一下你的代碼,這樣我們可以修復它或者告訴你錯誤的地方。 –

+0

請投票這一個以及然後:http://stackoverflow.com/questions/569694/count-duplicate-elements-in-ruby-array ;-)。我沒有添加我的代碼,因爲它很無聊,不會添加任何問題。任何一個花費1天以上的時間的人都會知道.map,.select,.flatten等的含義以及它與問題的關係。也就是說,我會考慮你的意見。謝謝你對這個問題的編輯。 – Corstiaan

+0

現有問題,尤其是遺留問題,尤其是近8年的問題,顯示出類似和更糟糕的問題,但這並不減少滿足當前目標和網站指南的需求。網站不斷髮展,我們試圖跟上新的問題並修復舊的問題。預計你會嘗試按照你提出的指導方針,而不是過去尋找理由。 –

回答

1
arr = [ 
    ["Ja", nil, "Bijna", nil, "Ja"], 
    ["Nee", nil, "Nee", "Ja", "Nee"], 
    [nil,  nil, "Bijna", "Nee", "Nee"], 
    ["Ja", nil,  nil, "Nee", "Ja"], 
    ["Bijna", nil, "Bijna", "Nee", "Ja"] 
] 

keys = arr.flatten.uniq 
    #=> ["Ja", nil, "Bijna", "Nee"] 
arr.transpose.map { |col| col.each_with_object(keys.product([0]).to_h) { |e,h| 
    h[e] += 1 } } 
    #=> [{"Ja"=>2, nil=>1, "Bijna"=>1, "Nee"=>1}, 
    # {"Ja"=>0, nil=>5, "Bijna"=>0, "Nee"=>0}, 
    # {"Ja"=>0, nil=>1, "Bijna"=>3, "Nee"=>1}, 
    # {"Ja"=>1, nil=>1, "Bijna"=>0, "Nee"=>3}, 
    # {"Ja"=>3, nil=>0, "Bijna"=>0, "Nee"=>2}] 

注:

arr.transpose 
    #=> [["Ja", "Nee",  nil, "Ja", "Bijna"], 
    # [nil,  nil,  nil, nil,  nil], 
    # ["Bijna", "Nee", "Bijna", nil, "Bijna"], 
    # [nil,  "Ja", "Nee", "Nee", "Nee"], 
    # ["Ja", "Nee", "Nee", "Ja", "Ja"]] 
+0

謝謝。剛離開辦公室。將在週末嘗試你的建議。 – Corstiaan

+0

這工作。非常感謝你。 – Corstiaan

2

a是你的大陣。

values = a.flatten.uniq 
all_values_hash = Hash[values.zip([0] * values.count)] 
a.transpose.map do |arr| 
    arr.each_with_object(Hash.new(0)) { |item, hash| hash[item] += 1 }   
end.map { |h| all_values_hash.merge(h) } 
+1

我喜歡將每個構造散列與'all_values_hash'合併的想法。 –

+0

謝謝。剛離開辦公室。將在週末嘗試你的建議。 – Corstiaan

+0

與卡里的方法,但謝謝你花時間來幫助我。 – Corstiaan

1

其他解決方案,但相反的邏輯類似。我發現它更易於閱讀。

keys = my_array.flatten.uniq 

final_result = my_array.transpose.map do |array| 
keys.each_with_object(Hash.new) do |key,result| 
    result[key] = array.count(key) 
end 
end 
+0

與卡里的方法,但謝謝你花時間來幫助我。 – Corstiaan