Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中的MapReduce数组_Ruby_Mapreduce - Fatal编程技术网

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"]} 
这使用了(aka
merge!
)的形式,它使用一个块(这里是
{| 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
更好。