3

我正在寻找从包含哈希图的数组中获得排序最常见的结果。hashmap 数据是非数字的,因此:

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

我可以在哪里获取最常见的网址。我考虑使用 SQL 来获取计数,对它们进行排序并完成它,但我认为在直接 ruby​​ 中可能有一种更快的方法来完成它,因为数组和哈希图不在数据库中,需要放在那里首先。

所以我正在寻找非 SQL 方法来做到这一点。请注意,我不仅要查找最常见的结果(单数),还要查找前 5 或 10 个常见结果。

4

3 回答 3

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 回答
0

怎么样

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

改变

[0..5]

到您需要的任何数字。

于 2012-10-07T14:16:47.597 回答
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 回答