我有一系列哈希,如下所示:
[
{:name=>"CCC_010112.JPG", :type=>"CCC", :date=>"120101"},
{:name=>"BBB_050112.JPG", :type=>"BBB", :date=>"120501"},
{:name=>"BBB_040112.JPG", :type=>"BBB", :date=>"120401"},
{:name=>"BBB_030112.JPG", :type=>"BBB", :date=>"120301"},
{:name=>"BBB_020112.JPG", :type=>"BBB", :date=>"120201"},
{:name=>"BBB_010112.JPG", :type=>"BBB", :date=>"120101"},
{:name=>"AAA_040112.JPG", :type=>"AAA", :date=>"120401"},
{:name=>"AAA_030112.JPG", :type=>"AAA", :date=>"120301"},
{:name=>"AAA_020112.JPG", :type=>"AAA", :date=>"120201"},
]
我正在尝试捕获每种类型的前三个。 (例如,我的结果应该产生数组bove,只删除“BBB”元素的底部两个。我尝试了以下变体:
puts a.each{|e| e[:type]}.take(3) #Shows top 3 of all
答案 0 :(得分:3)
我会使用Enumerable#chunk
,因为在数组中所有不同的类型,如'CCC'
,'BBB'
等已经聚集在一起。如果它们分散group_by
,首先要用不同类型的哈希来加入。
a = [
{:name=>"CCC_010112.JPG", :type=>"CCC", :date=>"120101"},
{:name=>"BBB_050112.JPG", :type=>"BBB", :date=>"120501"},
{:name=>"BBB_040112.JPG", :type=>"BBB", :date=>"120401"},
{:name=>"BBB_030112.JPG", :type=>"BBB", :date=>"120301"},
{:name=>"BBB_020112.JPG", :type=>"BBB", :date=>"120201"},
{:name=>"BBB_010112.JPG", :type=>"BBB", :date=>"120101"},
{:name=>"AAA_040112.JPG", :type=>"AAA", :date=>"120401"},
{:name=>"AAA_030112.JPG", :type=>"AAA", :date=>"120301"},
{:name=>"AAA_020112.JPG", :type=>"AAA", :date=>"120201"}
]
final_top3_ary = a.chunk { |hash| hash[:type] }.flat_map { |_,ary| ary.take(3) }
final_top3_ary
# => [{:name=>"CCC_010112.JPG", :type=>"CCC", :date=>"120101"},
# {:name=>"BBB_050112.JPG", :type=>"BBB", :date=>"120501"},
# {:name=>"BBB_040112.JPG", :type=>"BBB", :date=>"120401"},
# {:name=>"BBB_030112.JPG", :type=>"BBB", :date=>"120301"},
# {:name=>"AAA_040112.JPG", :type=>"AAA", :date=>"120401"},
# {:name=>"AAA_030112.JPG", :type=>"AAA", :date=>"120301"},
# {:name=>"AAA_020112.JPG", :type=>"AAA", :date=>"120201"}]
答案 1 :(得分:1)
这可能是一种更有效的方式,但不在顶层:
a = [
{:name=>"CCC_010112.JPG", :type=>"CCC", :date=>"120101"},
{:name=>"BBB_050112.JPG", :type=>"BBB", :date=>"120501"},
{:name=>"BBB_040112.JPG", :type=>"BBB", :date=>"120401"},
{:name=>"BBB_030112.JPG", :type=>"BBB", :date=>"120301"},
{:name=>"BBB_020112.JPG", :type=>"BBB", :date=>"120201"},
{:name=>"BBB_010112.JPG", :type=>"BBB", :date=>"120101"},
{:name=>"AAA_040112.JPG", :type=>"AAA", :date=>"120401"},
{:name=>"AAA_030112.JPG", :type=>"AAA", :date=>"120301"},
{:name=>"AAA_020112.JPG", :type=>"AAA", :date=>"120201"}
]
a_types = (a.collect { |e| e[:type] }).uniq
a_top3 = []
a_types.each { |t| a_top3 << (a.select { |e| e[:type] == t }).take(3) }
a_top3.flatten!
答案 2 :(得分:0)
由于您在评论中提到您的列表已经反向排序,我们可以使用:
top3_of_each = a.inject([]) do |acc, h|
acc << h if acc.length < 3 || h[:type] != acc[acc.length-3][:type]
acc
end
如果列表没有反向排序,那么我们需要做更多的工作来按类型分组哈希并找到每种类型的前3个。