2010-07-13 62 views
43

我可以生成几行代码,可以做到这一点,但我想知道是否有一个很好的干净的Rubyesque做这个的方式。如果我还没有清楚,我正在寻找的是一个数组方法,如果给定(例如)[3,3,3,3,3]["rabbits","rabbits","rabbits"]将返回true,但将返回错误[1,2,3,4,5]["rabbits","rabbits","hares"]如何测试数组中的所有项目是否相同?

感谢

回答

54
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。取决于你需要什么。

+2

这非常优雅。我可以直接在我的代码中使用.uniq.length == 1,而不是以前的方式(我只使用它一次,所以我保持干燥)。如果有一个内置的.same_values会很好吗?方法。我不需要担心我的代码中的空数组case,因为a)它不应该出现在我的情况中,并且b)如果它发生了,我希望它返回false。 谢谢。 – brad 2010-07-13 01:04:29

+2

请注意,'uniq'使用'hash'和'eql?'而不是'==',这可能会或可能不是您想要的。 – 2010-07-13 02:33:49

+1

当然有人可以用self.flatten.uniq.lenth == 1 – 2010-07-26 20:05:10

67

您可以使用Enumerable#all?如果给定块返回集合中的所有元素真正返回true。

array.all? {|x| x == array[0]} 

(如果数组是空的,该块不会被调用,这样做array[0]是安全的。)

+0

怎么样'(array.any {| X | X =数组[0]!}?)'!?在第一次出现不同值后,它不会迭代所有元素。 – 2014-02-27 14:39:45

+4

@ Nu-hin既不会“全部”。 – sepp2k 2014-02-27 14:54:43

+0

是的,我的不好,谢谢。 – 2014-02-28 15:03:07

9

我也喜欢首选答案最好,短而甜。如果所有元素都来自同一个枚举类,如数字或字符串,可以使用

def all_equal?(array) array.max == array.min end 
+0

油滑。很光滑。 – brad 2010-07-16 11:00:24

+2

对象不需要在同一个类中,它们只需要能够实现'<=>'(飞船操作员)。 – 2011-09-14 01:19:16

+0

@ArewrewGrimm如果对象是不同类型的,宇宙飞船运算符会导致此代码失败。 – 2016-11-05 05:03:57

1

我用:

def add_equal?(arr) arr.reduce { |x,y| x == y ? x : nil } end 

arr包含nil它可能会失败。

1

我会用:

array = ["rabbits","rabbits","hares", nil, nil] 
array.uniq.compact.length == 1 
相关问题