Ruby中的MapReduce数组
我有两个这样的阵列:Ruby中的MapReduce数组,ruby,mapreduce,Ruby,Mapreduce,我有两个这样的阵列: ["1","7","8","10"] arrays = [["1","7","8","10"], ["1","2","3","6","9","11"]].reduce(:+) arrays.inject(Hash.new(0)) { |memo, e| memo.update(e => memo[e] + 1) } # "{ "1" => 2, "7" => 1, "8" => 1, "10" => 1, "2" => 1, "3" =
["1","7","8","10"]
arrays = [["1","7","8","10"], ["1","2","3","6","9","11"]].reduce(:+)
arrays.inject(Hash.new(0)) { |memo, e| memo.update(e => memo[e] + 1) }
# "{ "1" => 2, "7" => 1, "8" => 1, "10" => 1, "2" => 1, "3" => 1, "6" => 1, "9" => 1, "11" => 1 }"
及
这些数组表示用户选择的名为Place
的类中的ID。我想选择投票最多的位置ID。我尝试了转置
,但由于数组大小不同,因此无法转置
本例的预期输出为:
{ "1" => 2, "7" => 1, "8" => 1, "10" => 1, "2" => 1, "3" => 1, "6" => 1, "9" => 1, "11" => 1 }
您可以将所有数组合并,并计算相同元素的数量,如下所示:
["1","7","8","10"]
arrays = [["1","7","8","10"], ["1","2","3","6","9","11"]].reduce(:+)
arrays.inject(Hash.new(0)) { |memo, e| memo.update(e => memo[e] + 1) }
# "{ "1" => 2, "7" => 1, "8" => 1, "10" => 1, "2" => 1, "3" => 1, "6" => 1, "9" => 1, "11" => 1 }"
获得此中间结果后,使用max\u by
从散列中选择具有最大值的键:
arrays = [["1","7","8","10"], ["1","2","3","6","9","11"]].reduce(:+)
arrays.inject(Hash.new(0)) { |memo, e| memo.update(e => memo[e] + 1) }
.max_by { |_, count| count }[0]
#=> "1"
这是另一种方式:
arr = [["1","7","8","10"], ["1","2","3","6","9","11"], ["1","2","7"]]
h = arr.flatten.sort_by(&:to_i).group_by(&:itself)
h.update(h) { |_,v| v.size }
#=> {"1"=>3, "2"=>2, "3"=>1, "6"=>1, "7"=>2, "8"=>1, "9"=>1, "10"=>1, "11"=>1}
步骤如下:
a = arr.flatten
#=> ["1", "7", "8", "10", "1", "2", "3", "6", "9", "11", "1", "2", "7"]
b = a.sort_by(&:to_i)
#=> ["1", "1", "1", "2", "2", "3", "6", "7", "7", "8", "9", "10", "11"]
h = b.group_by(&:itself)
#=> {"1"=>["1", "1", "1"], "2"=>["2", "2"], "3"=>["3"], "6"=>["6"],
# "7"=>["7", "7"], "8"=>["8"], "9"=>["9"], "10"=>["10"], "11"=>["11"]}
如果您使用的是Ruby 2.2之前的版本(引入时),则需要编写:
h = b.group_by { |s| s }
最后:
h.update(h) { |_,v| v.size }
#=> {"1"=>["1", "1", "1"], "2"=>["2", "2"], "3"=>["3"], "6"=>["6"],
# "7"=>["7", "7"], "8"=>["8"], "9"=>["9"], "10"=>["10"], "11"=>["11"]}
这使用了(akamerge!
)的形式,它使用一个块(这里是{| u,v | v.size}
)来确定合并的两个哈希中存在的键的值(在本例中是所有键)
更新:该方法首次出现在Ruby v2.4中。这允许我们写以下内容
arr.flatten.
sort_by(&:to_i).
group_by(&:itself).
transform_values(&:size)
但是我可以(并且将会)有更多的阵列,而且我需要第二个被选中的选项。我需要像
{1=>2,7=>1,8=>1}
这样的东西,以array=[…]+[…]
开头很难,因为数组的数量可能会有所不同。我建议您将array
视为数组的数组,然后添加array.reduce(:+)
额外步骤。除此之外,回答得很好。@CarySwoveland:是的,你是对的。当他有两个以上的数组时,flatten
或reduce
更好。