如何测试阵列中的所有项目是否相同?

bra*_*rad 51 ruby arrays

我可以生成几行代码,但是我想知道是否有一个很好的干净Rubyesque方式.如果我没有明确的,就是我正在寻找的是一个数组的方法,如果给定的(说),这将返回true [3,3,3,3,3]["rabbits","rabbits","rabbits"]但将返回false用[1,2,3,4,5]["rabbits","rabbits","hares"].

谢谢

sep*_*p2k 76

Enumerable#all?如果给定块对集合中的所有元素返回true,则可以使用which返回true.

array.all? {|x| x == array[0]}
Run Code Online (Sandbox Code Playgroud)

(如果数组为空,则永远不会调用该块,因此这样做array[0]是安全的.)

  • @ Nu-hin两者都不会"全部?". (5认同)
  • 这将使用更少的内存,并且可能比接受的答案更快,因为它会在第一次不匹配时退出。接受的答案将所有元素加载到一个散列中,然后计算该散列中的键数。 (3认同)

Fra*_*oto 63

class Array
  def same_values?
    self.uniq.length == 1
  end
end


[1, 1, 1, 1].same_values?
[1, 2, 3, 4].same_values?
Run Code Online (Sandbox Code Playgroud)

这个如何?它为空数组返回false,您可以将其更改为<= 1,在这种情况下它将返回true.根据您的需要而定.

  • @AndrewGrimm`unityq.one?`不处理nil值,例如; `a = ["3",nil,nil,nil]`,`a.same_values?`返回true (5认同)
  • 那很优雅.我可以直接在我的代码中使用.uniq.length == 1而不是你已经完成它的方式(我只使用它一次,所以我保持干燥).如果有一个内置的.same_values会很好吗?方法.我不需要担心我的代码中的空数组情况a)它不应该出现在我的情况中b)如果它确实我会希望它返回false.谢谢. (2认同)
  • 请注意,`uniq`使用`hash`和`eql?`而不是'==`,这可能是你想要的,也可能不是. (2认同)
  • 你可以使用[one?](http://www.ruby-doc.org/core/classes/Enumerable.html#M001501)方法:`uniq.one?` (2认同)

Car*_*and 10

我也喜欢最好的答案,简短而甜蜜.如果所有元素都来自同一个Enumerable类,例如Numeric或String,则可以使用

def all_equal?(array) array.max == array.min end
Run Code Online (Sandbox Code Playgroud)

  • 对象不需要在同一个类中,它们只需要能够实现`<=>`(宇宙飞船运营商). (2认同)