Проверьте, содержит ли массив больше нулей, чем другие значения - PullRequest
0 голосов
/ 30 августа 2018

Учитывая массив только с нечетным числом:

[1,nil,nil]
[1,nil,Module,nil,2]
[1,Class.new,nil]

Я бы хотел определить, есть ли нули или больше не нолей. Подход, который я использовал, состоял в том, чтобы сначала сделать все либо правдой, либо ложью. А затем определить, есть ли еще истинные или ложные значения:

[ 1,nil,nil,nil,2,3].collect {|val| !!!val }.max
#=> ArgumentError: comparison of TrueClass with false failed

Метод max не хочет хорошо играть с логическими значениями. Как мне это сделать?

Теперь, возможно, это не лучший подход, чтобы определить, есть ли больше nils или non-nils, но этот подход я использовал.

Ответы [ 4 ]

0 голосов
/ 31 августа 2018

Вот еще один:

if array.size > 2*array.compact.size
  # We have more nil than non-nil
end
0 голосов
/ 30 августа 2018

Учитывая массив только с нечетным числом

Если под этим вы подразумеваете, что в массиве всегда будет неравное количество истинных / ложных значений, то, во-первых, [] не является допустимым входным значением.

И вот решение:

def truthy?(array)
  falsey, truthy = array.partition(&:!)

  truthy.size > falsey.size
end

Вы можете пойти с oneliner, если вы предпочитаете:

def truthy?(array)
  array.partition(&:!).max_by(&:size).any?
end

Spec:

truthy?([1,nil,nil])          #=> false
truthy?([1,nil,nil,nil,2])    #=> false
truthy?([1,4,nil])            #=> true
truthy?([1,nil,nil])          #=> false
truthy?([1,nil,Module,nil,2]) #=> true
truthy?([1,Class.new,nil])    #=> true

Используется


Если вы действительно намеревались рассчитывать только nil с, а не ложные значения (как было указано в ОП):

def more_nils?(array)
  array.partition(&:nil?).max_by(&:size).none?
end

Spec:

more_nils?([1,nil,nil])          #=> true
more_nils?([1,nil,nil,nil,2])    #=> true
more_nils?([1,4,nil])            #=> false
more_nils?([1,nil,nil])          #=> true
more_nils?([1,nil,Module,nil,2]) #=> false
more_nils?([1,Class.new,nil])    #=> false

Используется метод Object#nil?.

Вдохновлен ответом @ pjs :

array.sum { |el| el.nil? ? -1 : 1 }.negative?

Еще проще (из комментария @ SagarPandya)

array.count(nil) > array.compact.count
0 голосов
/ 30 августа 2018

Довольно простым решением будет:

def truthy?(ary)
  ary.map { |bool| bool ? 1 : -1 }.sum > 0
end

Сопоставьте записи с +/- 1 на основе их истинности, суммы и посмотрите, является ли сумма положительной или отрицательной.

Это может иметь дело с пустыми массивами, в этом случае возвращается false.

0 голосов
/ 30 августа 2018

Предполагая, что ложные значения равны nil и false, а все остальное верно (как это делают условные выражения), вы можете использовать Object#itself с Array#select.

irb(main):013:0> ary = [1,nil,nil,false,2]
=> [1, nil, nil, false, 2]
irb(main):014:0> ary.select(&:itself).length
=> 2
irb(main):015:0> ary.reject(&:itself).length
=> 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...