2016-12-02 80 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