在我正在使用的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
有人能想出一种方法将其压缩成单行方法吗?
答案 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?。