数组数组中的Ruby group_by

时间:2013-11-21 18:43:46

标签: ruby arrays multidimensional-array

我的数组是

fruits = [["apple", "Tue"], ["mango", "Mon"], ["apple", "Wed"], ["orange", "Tue"]]

我想得到的结果是按水果分组和计数

[["apple", 2], ["mango", 1], ["orange", 1]]

当我想分组元素时,我一直只使用一个数组,如何使用数组数组?

4 个答案:

答案 0 :(得分:4)

fruits = [["apple", "Tue"], ["mango", "Mon"], ["apple", "Wed"], ["orange", "Tue"]]
fruits.group_by(&:first).map{|k,v| [k,v.size]}
# => [["apple", 2], ["mango", 1], ["orange", 1]]

答案 1 :(得分:3)

fruits.group_by {|(fruit, day)| fruit }.map {|fruit, match| [fruit, match.count] }

答案 2 :(得分:2)

您的示例格式看起来很像哈希。如果可以使用哈希,那么你可以这样做。

count = Hash.new(0)
fruits.each { |f| count[f.first] += 1 }
# => {"apple"=>2, "mango"=>1, "orange"=>1} 

然后你可以把它转换成一个数组。

count.to_a
# => [["apple", 2], ["mango", 1], ["orange", 1]] 

修改

作为旁注,将散列定义为Hash.new(0)意味着默认值为0而不是nil。这就是我们首先没有定义任何哈希键的方法。

编辑2

根据Arup的建议,这将转变为

counts = fruits.each_with_object(Hash.new(0)) { |f, h| h[f.first] += 1 }

取决于您的偏好。我发现第一个更容易阅读。

答案 3 :(得分:0)

迟到了,我发现开胃小菜几乎消失了。唉,我只剩下一块面包屑了:

f = fruits.map(&:first).sort
f.uniq.zip(f.chunk(&:dup).map(&:size)) # => [["apple", 2], ["mango", 2], ["orange", 2]]
  # => [["apple", 2], ["mango", 2], ["orange", 2]] 

如果我更准时,我会抓住其中一个美味的group_by馅饼。