3

ハッシュマップを含む配列からソートされた最も一般的な結果を取得しようとしています。ハッシュマップ データは数値ではないため、次のようになります。

line_value = {'date' => date, 'name' => name, 'url' => url }

最も一般的な URL を取得できます。SQLを使用してカウントを取得し、並べ替えて処理することを検討しましたが、配列とハッシュマップはデータベースになく、そこに配置する必要があるため、おそらくストレートルビーで行うより高速な方法があると思いますから始めます。

だから私はこれを行うための非SQLメソッドを探しています。最も一般的な結果 (単数) だけを探しているのではなく、上位 5 または 10 の一般的な結果を探していることに注意してください。

4

3 に答える 3

0
urls.map {|u| u["url"]}.inject(Hash.new(0)) {|k,v| k[v] += 1; k}.rank.sort_by {|k,v| v}.last(5).reverse

または:

urls.group_by {|k|{ :u => k["url"], :q => 0}}.map {|k,v| k[:q] = v.count; k}.sort_by {|k| k[:q]}.last(5).reverse
于 2012-10-07T14:06:41.747 に答える
0

どうですか

most_common_urls = line_value['url'].sort[0..9]

変化する

[0..5]

必要な数に。

于 2012-10-07T14:16:47.597 に答える
0

最初に行うことは、配列内の一意の URL の数を増やすことです。each_with_object私はこれを非常に好みinjectます(各ステップでハッシュを返す必要はありません):

url_count = items.each_with_object(Hash.new(0)) do |item, count|
  count[item['url']] += 1
end

# => {'example.com' => 1, 'facebook.com' => 4, 'twitter.com' => 2, ...}

次に、これを値でソートされたキーの配列に変換します。を使用Array#sort_byすると非常にうまく機能しますが、昇順でソートされます。最後のN 個のアイテムを取得して、それらを逆にすることができます。

top_urls = url_count.keys.sort_by!{|url| url_count[url]}.last(5).reverse!

または、最大数が前にソートされるようにカウントを無効にすることもできます。

top_urls = url_count.keys.sort_by!{|url| -url_count[url]}.first(5)
于 2012-10-07T15:02:23.633 に答える