单行版本的这个功能? (Ruby 1.8.6)

时间:2017-11-15 11:27:33

标签: ruby function

在我正在使用的Ruby版本中,(1.8.6 - 不要问),Hash类没有定义Hash#hash方法,这意味着调用uniq哈希数组不测试内容是否相同 - 它测试对象是否相同(使用默认的基础对象#哈希方法)。

为了解决这个问题,我可以使用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

有人能想出一种方法将其压缩成单行方法吗?

3 个答案:

答案 0 :(得分:2)

你能使用each_with_object吗?

hashes = [{title: 'a'}, {title: 'b'}, {title: 'c'}, {title: 'a'}]
p hashes.each_with_object([]) { |el, array| array << el unless array.include? el }.size
# 3

答案 1 :(得分:1)

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
     

有人能想出一种方法将其压缩成单行方法吗?

易:

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

事实上,您可以总是任何 Ruby代码压缩成一行,因为换行符是完全可选的。换行符总是可以用分号,分隔符关键字替换,或者只是替换。

答案 2 :(得分:1)

不是使用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}]

请参阅Set#add?