Как проверить, идентичны ли все элементы массива?
Я могу создать несколько строк кода, которые будут делать это, но мне интересно, есть ли хороший чистый Rubyesque способ сделать это. В случае, если я не был ясен, то, что я ищу, - это метод массива, который вернет true, если задан (скажем) [3,3,3,3,3]
или ["rabbits","rabbits","rabbits"]
, но вернет false с помощью [1,2,3,4,5]
или ["rabbits","rabbits","hares"]
.
Спасибо
Ответы
Ответ 1
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
Вы можете использовать Enumerable#all?
, который возвращает true, если данный блок возвращает true для всех элементов в коллекции.
array.all? {|x| x == array[0]}
(Если массив пуст, блок никогда не вызывается, поэтому array[0]
безопасен.)
Ответ 3
Я тоже предпочитаю лучший ответ, короткий и сладкий. Если все элементы были из того же класса Enumerable, например Numeric или String, можно было использовать
def all_equal?(array) array.max == array.min end
Ответ 4
Я использовал:
def add_equal?(arr) arr.reduce { |x,y| x == y ? x : nil } end
Он может выйти из строя, если arr
содержит nil
.
Ответ 5
Я бы использовал:
array = ["rabbits","rabbits","hares", nil, nil]
array.uniq.compact.length == 1