Ruby check array, вернуть индексы, какие данные существуют

Вопрос:

Как я могу проверить, есть ли данные, которые не ноль в массиве, а затем вернуть индекс этих данных? Пример:

myary = [nil, nil, 300, nil, nil] # <= index 2 is 300

теперь есть способ получить значение 2? Как известно, индекс 2 равен 300 и не равен нулю. Мне нужно, чтобы индекс не был значением. И, кроме того, вероятно, будет только один элемент, который не равен нулю, возможно, массив может быть таким

myotherary = [nil, nil, 300, 400, nil] # <= index 2,3 = 300,400

теперь для этого мне нужно получить 2 и 3 значения, это почка? Хорошо, спасибо, я очень благодарен за ответ.

PS: Пожалуйста, не пылайте, если вы не хотите помогать, тогда просто уходите, я потратил некоторое время на то, чтобы решить этот вопрос и не получится. Я не буду спрашивать здесь, могу ли я решить это сам. У меня было достаточно тех, кто не помогал, вместо этого спрашивал “какой метод вы пробовали?” или написать что-то другое, что на самом деле не помогает, а просто мешает.

Лучший ответ:

Вы можете использовать map.with_index:

myary.map.with_index { |v, i| i if v }.compact
# => [2]
myotherary.map.with_index { |v, i| i if v }.compact
# => [2, 3]

Ответ №1

Я был бы склонен использовать Enumerable # select отчасти потому, что он хорошо читается; слово “выбрать” описывает то, что вы хотите сделать.

Код

Только для индексов:

def indices_only(arr)
arr.size.times.select { |i| arr[i] }
end

Если было бы более полезно возвращать как значения, отличные от нуля, так и соответствующие индексы:

def values_and_indices(arr)
arr.each_with_index.select(&:first)
end

Примеры

arr1 = [nil, nil, 300, nil, nil]
arr2 = [nil, nil, 300, 400, nil]

indices_only(arr1)       #=> [2]
indices_only(arr2)       #=> [2, 3]

values_and_indices(arr1) #=> [[300, 2]]
values_and_indices(arr2) #=> [[300, 2], [400, 3]]

Оцените статью
TechArks.Ru
Добавить комментарий