我可以生成几行代码,可以做到这一点,但我想知道是否有一个很好的干净的Rubyesque做这个的方式。如果我还没有清楚,我正在寻找的是一个数组方法,如果给定(例如)[3,3,3,3,3]
或["rabbits","rabbits","rabbits"]
将返回true,但将返回错误[1,2,3,4,5]
或["rabbits","rabbits","hares"]
。如何测试数组中的所有项目是否相同?
感谢
我可以生成几行代码,可以做到这一点,但我想知道是否有一个很好的干净的Rubyesque做这个的方式。如果我还没有清楚,我正在寻找的是一个数组方法,如果给定(例如)[3,3,3,3,3]
或["rabbits","rabbits","rabbits"]
将返回true,但将返回错误[1,2,3,4,5]
或["rabbits","rabbits","hares"]
。如何测试数组中的所有项目是否相同?
感谢
class Array
def same_values?
self.uniq.length == 1
end
end
[1, 1, 1, 1].same_values?
[1, 2, 3, 4].same_values?
这件怎么样?然而它对于一个空数组返回false,你可以将其更改为< = 1,在这种情况下它将返回true。取决于你需要什么。
您可以使用Enumerable#all?
如果给定块返回集合中的所有元素真正返回true。
array.all? {|x| x == array[0]}
(如果数组是空的,该块不会被调用,这样做array[0]
是安全的。)
怎么样'(array.any {| X | X =数组[0]!}?)'!?在第一次出现不同值后,它不会迭代所有元素。 – 2014-02-27 14:39:45
@ Nu-hin既不会“全部”。 – sepp2k 2014-02-27 14:54:43
是的,我的不好,谢谢。 – 2014-02-28 15:03:07
我也喜欢首选答案最好,短而甜。如果所有元素都来自同一个枚举类,如数字或字符串,可以使用
def all_equal?(array) array.max == array.min end
油滑。很光滑。 – brad 2010-07-16 11:00:24
对象不需要在同一个类中,它们只需要能够实现'<=>'(飞船操作员)。 – 2011-09-14 01:19:16
@ArewrewGrimm如果对象是不同类型的,宇宙飞船运算符会导致此代码失败。 – 2016-11-05 05:03:57
我用:
def add_equal?(arr) arr.reduce { |x,y| x == y ? x : nil } end
时arr
包含nil
它可能会失败。
我会用:
array = ["rabbits","rabbits","hares", nil, nil]
array.uniq.compact.length == 1
这非常优雅。我可以直接在我的代码中使用.uniq.length == 1,而不是以前的方式(我只使用它一次,所以我保持干燥)。如果有一个内置的.same_values会很好吗?方法。我不需要担心我的代码中的空数组case,因为a)它不应该出现在我的情况中,并且b)如果它发生了,我希望它返回false。 谢谢。 – brad 2010-07-13 01:04:29
请注意,'uniq'使用'hash'和'eql?'而不是'==',这可能会或可能不是您想要的。 – 2010-07-13 02:33:49
当然有人可以用self.flatten.uniq.lenth == 1 – 2010-07-26 20:05:10