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

bttbmeg0  于 2023-04-29  发布在  Ruby
关注(0)|答案(7)|浏览(168)

我对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-esque)的方法来做到这一点?

TL;DR检查一个数组是否只包含一个不同的元素(例如:例如[5, 5, 5]

谢谢。

h43kikqp

h43kikqp1#

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

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

gywdnpxw2#

有几种方法。
最好的一个:

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]
voj3qocg

voj3qocg3#

使用Enumerable#each_cons:

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

wi3ka0sx4#

这在Ruby 3上是有效的。0+:

[1,1,1,1].minmax.reduce(&:eql?)

看起来很漂亮但可能不是最快的。

dbf7pr2w

dbf7pr2w5#

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

34gzjxbg

34gzjxbg6#

试试这个..

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

oxosxuxt7#

看起来,在以后的版本中,您可以直接将匹配的参数传递给all?,而不需要阻塞

[5, 5, 5].all?(5) # => true

相关问题