Сортировать массив по популярности и времени в рубине - PullRequest
0 голосов
/ 03 февраля 2012

Я новичок в Ruby Rails.

Есть ли способ узнать популярность элементов в массиве с течением времени?

Например, скажем, за последние 15 минут.

Массив, как ["abc", "ab", "abc", "a", "abc", "ab" ........] вставляется в массив ... можем ли мы получить "abc" и "ab" как самые популярные из них ... только за последние 15 минут?

Если взять целый час ... типично для всего часа ... "abcd" является самым популярным ... он должен возвращать "abcd" как самый популярный элемент в массиве ..

Есть ли способ достичь этого?

1 Ответ

3 голосов
/ 03 февраля 2012

Создайте свой собственный класс, который наследует от Array, или делегирует все его функциональные возможности Array. Например:

class TimestampedArray
  def initialize
    @items = []
  end

  def <<(obj)
    @items << [Time.now,obj]
  end

  # get all the items which were added in the last "seconds" seconds
  # assumes that items are kept in order of add time
  def all_from_last(seconds)
    go_back_to = Time.now - seconds
    result     = []
    @items.reverse_each do |(time,item)|
      break if time < go_back_to
      result.unshift(item)
    end
    result
  end
end

Если у вас старая версия Ruby, в которой нет reverse_each:

def all_from_last(seconds)
  go_back_to = Time.now - seconds
  result     = []
  (@items.length-1).downto(0) do |i|
    time,item = @items[i]
    break if time < go_back_to
    result.unshift(item)
  end
  result
end

Тогда вам нужно что-то, чтобы найти «самый популярный» предмет. Я часто использую эту служебную функцию:

module Enumerable
  def to_histogram
    result = Hash.new(0)
    each { |x| result[x] += 1 }
    result
  end
end

На котором вы могли бы основываться:

module Enumerable
  def most_popular
    h = self.to_histogram
    max_by { |x| h[x] }
  end
end

Итак, вы получите:

timestamped_array.all_from_last(3600).most_popular # "most popular" in last 1 hour
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...