这个函数的一个线性版本?(Ruby 1.8.6)
在我使用的Ruby版本中,(1.8.6-不问),Hash类没有定义这个函数的一个线性版本?(Ruby 1.8.6),ruby,function,Ruby,Function,在我使用的Ruby版本中,(1.8.6-不问),Hash类没有定义Hash#Hash方法,这意味着对一组Hash调用uniq不会测试内容是否相同,而是测试对象是否相同(使用默认的基本对象#Hash方法) 为了解决这个问题,我可以使用include?,如下所示: hashes = <a big list of hashes> uniq_hashes = [] hashes.each do |hash| unless uniq_hashes.include?(hash) un
Hash#Hash
方法,这意味着对一组Hash调用uniq
不会测试内容是否相同,而是测试对象是否相同(使用默认的基本对象#Hash方法)
为了解决这个问题,我可以使用include?
,如下所示:
hashes = <a big list of hashes>
uniq_hashes = []
hashes.each do |hash|
unless uniq_hashes.include?(hash)
uniq_hashes << hash
end
end;uniq_hashes.size
散列=
uniq_散列=[]
hash.each do| hash|
除非uniq_散列。包括?(散列)
uniq\u散列您可以将每个\u与\u对象一起使用吗
hashes = [{title: 'a'}, {title: 'b'}, {title: 'c'}, {title: 'a'}]
p hashes.each_with_object([]) { |el, array| array << el unless array.include? el }.size
# 3
hash=[{title:'a'},{title:'b'},{title:'c'},{title:'a'}]
p散列。每个_与_对象([]){el,数组|数组
散列=
uniq_散列=[]
hash.each do| hash|
除非uniq_散列。包括?(散列)
uniq_hash不是使用include?
来检查每个哈希是否与以前检查过的哈希匹配,而是可以通过使用集合来加快速度。回想一下,集合是用隐藏的哈希实现的,这解释了为什么查找速度如此之快
require 'set'
def uniq_hashes(arr)
st = Set.new
arr.select { |h| st.add?(h) }
end
uniq_hashes [{ a: 1, b: 2 }, { b: 2, a: 1 }, { a: 1, c: 2 }]
#=> [{:a=>1, :b=>2}, {:a=>1, :c=>2}]
请参阅。如果哈希值
是数组,则哈希值。uniq
可以。@maximusツ Ruby 1.8.6中没有。请参阅:如何实现Hash#Hash
和Hash#eql?
,这样您就可以使用uniq
?@Stefan这将是我的下一个问题!我只是想知道上面的一个更简洁的版本。@MaxWilliams从Marc AndréLafortune那里看一看。太好了,我没有看到每个带有对象的before-handy!对不起,我只是把正确的状态从这里去掉,并把它交给@CarySwoveland,因为他的回答(不是严格的一行,但很容易改成一行)对于大型数组,运行时间很短。很抱歉,如果这违反了SE协议!哇,我刚刚用88000个大型散列数组对其进行了基准测试,这比@SebastiánPalma标记为正确的答案快得多。我猜这是意料之中的,因为include?
方法中的操作数将增加行的大小和数组大小成指数关系。我以前从未真正使用过集合,我会仔细研究一下。非常感谢。
hashes = <a big list of hashes>; uniq_hashes = []; hashes.each do |hash| unless uniq_hashes.include?(hash) then uniq_hashes << hash end end;uniq_hashes.size
require 'set'
def uniq_hashes(arr)
st = Set.new
arr.select { |h| st.add?(h) }
end
uniq_hashes [{ a: 1, b: 2 }, { b: 2, a: 1 }, { a: 1, c: 2 }]
#=> [{:a=>1, :b=>2}, {:a=>1, :c=>2}]