我的数组是
fruits = [["apple", "Tue"], ["mango", "Mon"], ["apple", "Wed"], ["orange", "Tue"]]
我想得到的结果是按水果分组和计数
[["apple", 2], ["mango", 1], ["orange", 1]]
当我想分组元素时,我一直只使用一个数组,如何使用数组数组?
答案 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馅饼。