Arrays 如何将数组数组中的值计数为散列

Arrays 如何将数组数组中的值计数为散列,arrays,ruby,hash,Arrays,Ruby,Hash,我已经盯着下面的数组看了几个小时了,任何组合的merge,select,find,map,plant,等等,都无法帮助我 我创建了一些丑陋的嵌套循环,但没有一个接近Ruby的方式 我有一个数组: [ ["Ja", nil, "Bijna", nil, "Ja"], ["Nee", nil, "Nee", "Ja", "Nee"], [nil, nil, "Bijna", "Nee", "Nee"], ["Ja", nil, nil, "Nee", "Ja"], ["Bijna", nil, "B

我已经盯着下面的数组看了几个小时了,任何组合的
merge
select
find
map
plant
,等等,都无法帮助我

我创建了一些丑陋的嵌套循环,但没有一个接近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]]
]

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) }
注:


与其他解决方案类似,但逻辑相反。我发现它更容易阅读

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

欢迎来到SO。请阅读“”和“”,以及。看起来您要求我们为您编写代码,因为您没有向我们展示您尝试了什么以及它有什么问题。最好让我们看看你的代码,这样我们就可以修复它,或者告诉你哪里出了问题。请也投票否决这个:;-)。我没有添加我的代码,因为它很无聊,不会添加任何问题。任何与Ruby相处超过一天的人都会知道.map、.select、.flatte等的含义,以及它与问题的关系。话虽如此,我将考虑你的评论,并继续前进。同样感谢您对问题的编辑。现有问题,特别是遗留问题,尤其是近8年的问题,显示出类似和更严重的问题,但这并不减少满足网站当前目标和指南的需要。网站不断发展,我们努力跟上新的问题并修复旧的问题。当你问问题时,你会尽量遵循现有的指导原则,而不是寻找过去的理由。足够公平,这是有道理的。不过,关于我的问题,我希望能得到一些帮助。你能帮我解决这个问题吗?我喜欢将每个构造的散列与
所有值\u散列
合并的想法。谢谢。刚离开办公室。我将在周末尝试你的建议。同意卡里的方法,但感谢你抽出时间来帮助我。谢谢。刚离开办公室。我将在周末尝试你的建议。我同意卡里的方法,但感谢你抽出时间来帮助我。
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"]] 
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