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