0

次のようなハッシュの配列があります。

[
  {: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"},
]

各タイプの最初の 3 つをキャプチャしようとしています。(たとえば、私の結果は、「BBB」要素の下位 2 つだけを切り取って、上記の配列を生成する必要があります。次のバリエーションを試しました。

puts a.each{|e| e[:type]}.take(3) #Shows top 3 of all
4

3 に答える 3

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"}]
于 2014-03-13T22:36:58.370 に答える
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 を見つける作業をさらに行う必要があります。

于 2013-05-29T01:09:35.630 に答える