Как проверить, все ли элементы в массиве идентичны? - PullRequest
49 голосов
/ 13 июля 2010

Я могу сгенерировать несколько строк кода, которые сделают это, но мне интересно, есть ли хороший чистый способ Rubyesque сделать это.В случае, если мне неясно, что я ищу, это метод массива, который вернет true, если задано (скажем) [3,3,3,3,3] или ["rabbits","rabbits","rabbits"], но вернет false с [1,2,3,4,5] или ["rabbits","rabbits","hares"].

Спасибо

Ответы [ 5 ]

75 голосов
/ 13 июля 2010

Вы можете использовать Enumerable#all?, который возвращает true, если данный блок возвращает true для всех элементов в коллекции.

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

(Если массив пустой, блок никогда не вызывается, поэтомуarray[0] безопасно.)

62 голосов
/ 13 июля 2010
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. В зависимости от того, что вам нужно. </p>

10 голосов
/ 16 июля 2010

Мне тоже нравится предпочтительный ответ лучше всего, короткий и сладкий.Если бы все элементы были из одного и того же класса Enumerable, такого как Numeric или String, можно использовать

def all_equal?(array) array.max == array.min end
2 голосов
/ 13 февраля 2016

Я использовал для:

array.reduce { |x,y| x == y ? x : nil }

Может произойти сбой, если array содержит nil.

1 голос
/ 09 ноября 2017

Я бы использовал:

array = ["rabbits","rabbits","hares", nil, nil]
array.uniq.compact.length == 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...