В массиве без целого числа пропустите его, не выдавая ошибку - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь создать метод, который принимает массив в качестве аргумента и умножает число в массиве на индекс массивов. Когда есть элемент, который не является числом, я хочу пропустить его и не включать его в новый массив

Например, add_index_to_array ([1, 2, 3, 4, 5]) должен вернуть [ 0, 2, 6, 12, 20]

Например, add_index_to_array (["A", 32, true, "B", 5.3, 0]) должно вернуть [32, 21.2, 0]

def add_index_to_array (array)
  new_array = array.map.with_index { |i,a| i * a}
  #if my array includes anything but a number return an empty array
end
puts add_index_to_array(['a',2,3,4])
# ["", 2, 6, 12]

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Следуя тому, что вы пробовали до сих пор, вы можете использовать next для перехода к следующему элементу в массиве во время итерации, если только элемент не является целым числом:

array.map.with_index do |i,a|
  next unless i.is_a?(Integer)
  i * a
end

Это оставит ноль значения после того, как элемент пропущен, так что вы можете использовать compact в конце концов, чтобы удалить их.

array.map.with_index do |i,a|
  next unless i.is_a?(Integer)
  i * a
end.compact

Но на самом деле есть много способов. Самый простой для понимания (для меня) - это использовать each_with_object плюс with_index, чтобы вы могли получить три объекта во время итерации; текущий элемент, аккумулятор и указатель. Таким образом, вы можете положить sh в аккумулятор произведение текущего индекса и текущего элемента только в том случае, если текущий элемент является целым числом:

array.each_with_object([]).with_index do |(e, array), index|
  array << index * e if e.is_a?(Integer)
end

Если обратиться к вашему последнему примеру, ясно вам следует проверять объекты Numeri c вместо целых, поскольку 5.3 не является целым числом.

0 голосов
/ 05 марта 2020

Ввод

a = ["A", 32, true, "B", 5.3, 0,6]

Код

a.select { |x| x.is_a?(Numeric) }
    .map
    .with_index { |val, i| val * i }
#=>[0, 5.3, 0, 18]

Я проверил по классу Numeri c, потому что ваш номер может быть Integer или Float.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...