2013-07-12 126 views
0

我有这样的事情:红宝石路值

a = [{"group_id" => 1, "student_id" => 3, "candies" => 4}, 
    {"group_id" => 2, "student_id" => 1, "candies" => 3}, 
    {"group_id" => 1, "student_id" => 2, "candies" => 2}, 
    {"group_id" => 3, "student_id" => 4, "candies" => 6}, 
    {"group_id" => 1, "student_id" => 5, "candies" => 1}, 
    {"group_id" => 3, "student_id" => 6, "candies" => 1}, 
    {"group_id" => 4, "student_id" => 8, "candies" => 3}] 

我有三组学生,每个学生得到一定数量的糖果。我想统计一组糖果的总数。为此,我需要了解属于某个团体的学生并积累他们的糖果。我可以使用循环和初始化计数为零它:

aa = a.group_by { |a| a["group_id"] } 
# => 
{ 
    1 => [ 
    {"group_id"=>1, "student_id"=>3, "candies"=>4}, 
    {"group_id"=>1, "student_id"=>2, "candies"=>2}, 
    {"group_id"=>1, "student_id"=>5, "candies"=>1} 
    ], 
    2 => [{"group_id"=>2, "student_id"=>1, "candies"=>3}], 
    3 => [ 
    {"group_id"=>3, "student_id"=>4, "candies"=>6}, 
    {"group_id"=>3, "student_id"=>6, "candies"=>1} 
    ], 
    4 => [{"group_id"=>4, "student_id"=>8, "candies"=>3}] 
} 

但我不能够在group_id内累积值。我想知道是否有任何简洁的表示方式。我如何总结一组中存在的糖果总数?

+0

什么是三组和四'group_id's之间的关系? – sawa

+0

b/w他们没有关系。 – shashydhar

+0

那么问题中提到的群体是什么?这完全不清楚。 – sawa

回答

1

你的第一步(分组)是正确的。在此之后,你可以使用以下命令:

a.group_by {|g| g['group_id']}.map do |g, students| 
    {group_id:g, candies:students.map {|st| st['candies']}.inject(&:+)} 
end 

map功能通常与收藏,而不是循环使用,使每个元素上的一些操作和返回集合的修改版本。

输出:

[{:group_id=>1, :candies=>7}, 
{:group_id=>2, :candies=>3}, 
{:group_id=>3, :candies=>7}, 
{:group_id=>4, :candies=>3}] 
+0

非常感谢这个答案。在我自己的代码中,我用注入替换了注入,因为我不需要重型注入机器。 – shashydhar

0

添加到@StasS答案,更直接的散列的方式做(用更隐秘的代码)是这样的:

> Hash[a.group_by{|g| g['group_id']}.map{|g,s| [g, s.inject(0){|a,b| a + b["candies"]}]}] 
=> {1=>7, 2=>3, 3=>7, 4=>3} 

可展开这样的线:

groups = a.group_by{|g| g['group_id']} 
id_candies_pairs = groups.map{|g,s| [g, s.inject(0){|a,b| a + b["candies"]}]} 
id_candies_hash = Hash[id_candies_pairs] 
return id_candies_hash 
0

对@StasS,你也可以只建立像简单的寻找哈希:

totals_by_group_id = {} 
a.group_by {|g| g['group_id']}.map do |g, students| 
    totals_by_group_id[g] = students.map {|st| st['candies']}.inject(&:+) 
end 

产生的totals_by_group_id哈希:

{1=>7, 2=>3, 3=>7, 4=>3}