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

Inp*_*ame 7 ruby arrays equality

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

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

arr = [5, 5, 5, 5, 5]
Run Code Online (Sandbox Code Playgroud)

我知道我可以做点什么

arr[0] == arr[1] == arr[2] == arr[3] # == arr[4] == ...
Run Code Online (Sandbox Code Playgroud)

但是对于大型阵列来说这是不可能的,而且在我看来也不像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
Run Code Online (Sandbox Code Playgroud)

但我也认为这很难看.那么有没有内置/更好/更短(更多Ruby风格)的方式来做到这一点?

TL; DR什么是检查数组是否只包含一个不同元素(例如 [5, 5, 5])的最短/最Ruby特有的方法

谢谢.

Lua*_*ico 14

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

def all_equal?(arr)
    arr.uniq.size <= 1
end
Run Code Online (Sandbox Code Playgroud)

  • 事实上它是开放的解释 - 对我来说,一个空数组具有相同的所有元素,因为它没有元素:)它确实不是非常有效,更好的方式是`for`.但是我们经常在红宝石中交换速度与漂亮,因为这些操作很少成为大多数应用程序的瓶颈. (3认同)

SHS*_*SHS 8

几种方式.

最好的:

array.uniq.count <= 1 # or == 1 if it can't be an empty array
Run Code Online (Sandbox Code Playgroud)

和:

array == ([array.first] * array.count)
Run Code Online (Sandbox Code Playgroud)

和:

(array | array).count <= 1 # basically doing the same thing as uniq
Run Code Online (Sandbox Code Playgroud)

也:

array.reduce(:|) == array.first # but not very safe
Run Code Online (Sandbox Code Playgroud)

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

array.min == array.max    
Run Code Online (Sandbox Code Playgroud)

而且,只是为了多样化:

!array.any?{ |element| element != array[0] } # or array.first instead of array[0]
Run Code Online (Sandbox Code Playgroud)

或者:

array.all?{ |element| element == array[0] } # or array.first instead of array[0]
Run Code Online (Sandbox Code Playgroud)


tok*_*and 5

使用Enumerable#each_cons

def all_equal?(xs)
  xs.each_cons(2).all? { |x, y| x == y }
end
Run Code Online (Sandbox Code Playgroud)