这个函数的一个线性版本?(Ruby 1.8.6)

这个函数的一个线性版本?(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

在我使用的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)
    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}]