什么是确定数组是否只有唯一条目的Ruby方法?

时间:2016-01-29 16:38:39

标签: arrays ruby

我想知道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?

我更喜欢优雅,可读,而不是复杂但性能更好的解决方案。

3 个答案:

答案 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