我想知道Array
是否只包含唯一(不同)条目。
[1,2,3,2].what_goes_here? #=> false
[1,2,3,4].what_goes_here? #=> true
我不想操纵原始数组,所以
的uniq! {| item | ......}→ary或nil ... 如果没有做出任何更改,则返回nil(即,没有找到重复项)。
似乎不是正确的解决方案。否则我可能会[1,2,3,4].uniq!.nil?
。
我更喜欢优雅,可读,而不是复杂但性能更好的解决方案。
答案 0 :(得分:5)
array.uniq.size == array.size
array.to_set.size == array.size
array.all? { |element| array.count(element) == 1 }
答案 1 :(得分:2)
a = [1, 2, 3, 2]
a.dup.uniq!.nil? # false
a.uniq == a # false
a & a == a # false
a | a == a # false
答案 2 :(得分:1)
如果数组很大,您可能希望使用一种顺序检查元素的方法,并在找到dup时停止,而不是遍历整个数组。你可以用哈希有效地做到这一点:
def dups?(arr)
arr.each_with_object({}) do |e,h|
return true if h[e]
h[e] = true
end
false
end
dups? [1,2,3,1,4,5,6,3,1,8,9]
#=> true
dups? [1,2,3,4,5,6,-6,-5,-4,-3,-2,-1]
#=> false
...或有一套:
require 'set'
def dups?(arr)
arr.each_with_object(Set.new) do |e,s|
return true if s.include? e
s << e
end
false
end