Ruby:检查所有数组元素是否相等

时间:2014-12-14 16:18:53

标签: ruby arrays equality

我有一点问题'使用Ruby代码。 我想检查一个数组的所有元素是否相等。

例如,假设我的数组只有5个:

arr = [5, 5, 5, 5, 5]

我知道我可以做类似

的事情
arr[0] == arr[1] == arr[2] == arr[3] # == arr[4] == ...

但是对于大型阵列来说这是不可能的,在我看来也不像Ruby那样。 我们可以通过这样做来改进它:

def all_equal?(arr)
  for i in 0..(arr.size-2)
    if arr[i] != arr[i+1] then
      return false
    end
  end
  true
end

但我也认为这很难看。那么有没有内置/更好/更短(更多Ruby风格)的方法呢?

TL; DR检查数组是否仅包含一个不同元素的最短/最Ruby方式(例如 [5, 5, 5] < / p>

感谢。

5 个答案:

答案 0 :(得分:10)

你也可以使用.uniq,它返回一个没有重复的数组,并检查大小:

def all_equal?(arr)
    arr.uniq.size <= 1
end

答案 1 :(得分:7)

几种方式。

最好的一个:

array.uniq.count <= 1 # or == 1 if it can't be an empty array

array == ([array.first] * array.count)

(array | array).count <= 1 # basically doing the same thing as uniq

此外:

array.reduce(:|) == array.first # but not very safe

如果它是一个可排序的数组,那么:

array.min == array.max    

而且,只是为了多样化:

!array.any?{ |element| element != array[0] } # or array.first instead of array[0]

可替换地:

array.all?{ |element| element == array[0] } # or array.first instead of array[0]

答案 2 :(得分:2)

使用Enumerable#each_cons

def all_equal?(xs)
  xs.each_cons(2).all? { |x, y| x == y }
end

答案 3 :(得分:1)

对数组进行排序,并将第一个值与最后一个值进行比较。

答案 4 :(得分:1)

尝试一下..

array = ["cars","cars","truck", nil]
array.uniq.compact.length == 1