我有一个ruby脚本,它会记录特定对象出现的次数 - 它不起作用,因为我发现每个数据结构都按键进行排序,或者它是按值排序,它返回数组或数组
我想知道存储这些数据的最佳方法是......
我只有一堆对象,ID来自数据库,当我遍历一组给定的数据时,我想跟踪我使用某个对象的次数,所以我需要增加使用次数给定对象。
基本上我正在做的是创建一个排序的优先级队列,我想确保每个对象的使用次数与其他对象一样多,所以我按事件对列表进行排序,并使用最少的对象首先发生。
答案 0 :(得分:1)
理论上,我会使用SortedSet类+自定义类来完成三件事:实现#eql?
,hash
和<=>
。它看起来像这样:
class WeightedEntry
attr_accessor :weight, :object
def initialize(object)
@object = object
@weight = 1
end
def hash
self.object.hash
end
def eql?(other)
self.equal?(other) || self.object.equal?(other.object)
end
def <=>(other)
self.weight <=> other.weight
end
def incr
@weight += 1
end
end
但是,查看源代码(set.rb
),只有在加载路径中某处有rbtree
时,此类才有效。因此,您需要确保get that as well。
您的下一个问题是修改重量不会重新平衡rbtree
。我不知道如何解决这个问题。
唉,这是我的数据结构-fu发出的地方和just use Redis,但也许这会启发你发现解决方案。
答案 1 :(得分:0)
所以这就是我结束的地方..有一个有效的解决方案。我使用普通数组作为排序的优先级队列,因此,不是将对象的ID作为键,而是将其访问的次数,我将对象ID存储在数组中。
使用ID数组,当需要'递增'时,我只需将其从数组中删除,然后将其推回到数组的末尾 - 因为数组的“隐含”索引是保留顺序。