Получение значения трех последовательных элементов в массиве - PullRequest
2 голосов
/ 30 октября 2011

У меня есть большой массив, h, который содержит несколько экземпляров параметра с именем startingParam, за которым всегда следуют два других параметра, которые связаны, но не всегда одинаковы. Мне нужно искать каждый экземпляр startingParam в массиве и помещать его и следующие два параметра в отдельный массив holdingArray.

Следующий код не работает из-за того, что я новичок в Ruby. Кто-нибудь знает, что я делаю не так? Есть ли лучший способ подойти к проблеме?

h.each do |param|
    if param == 'startingParam'
        holdingArray << h.[param],
        holdingArray << h.[param + 1],
        holdingArray << h.[param + 2]
    end
end

Большое спасибо.

Ответы [ 4 ]

5 голосов
/ 30 октября 2011

Вы можете получить фрагменты, используя #slice_before:

arr = ['startingParam', 1, 2, 'startingParam', 3, 4]

arr.slice_before('startingParam')
# => [['startingParam', 1, 2], ['startingParam', 3, 4]]

Если вы создали исходную структуру данных, вы, возможно, захотите пересмотреть свой дизайн.

3 голосов
/ 30 октября 2011

Функциональный подход:

>> ary = ['hello', 'startingParam', 1, 2, 'xyz', 'startingParam', 3, 4, 'bye']    
>> ary.each_cons(3).select { |v, *vs| v == "startingParam" }.flatten(1)
=> ["startingParam", 1, 2, "startingParam", 3, 4]
2 голосов
/ 30 октября 2011

Итак, есть несколько проблем.Для начала, вы не можете подписывать массивы, выполняя h.[anything], и вы также подписываетесь на основе значения (а не индекса).Вы также проверяете, соответствует ли параметр буквальной строке «стартовый_парам», а не его значению.Итак, я ожидаю, что вы хотите следующее:

h.each_with_index do |param, index|
  if param == startingParam
    holdingArray << h[index]
    holdingArray << h[index+1]
    holdingArray << h[index+2]
  end
end

Вы также заметите, что если элемент находится в последних двух слотах массива, он будет обернут и захватит элементы с началамассив (из-за того, как Ruby обрабатывает подписки массива вне границ).

1 голос
/ 30 октября 2011

Вы также можете использовать операцию нарезки диапазонов (я немного изменил имена переменных, поскольку верблюд - плохой стиль в ruby)

h.each_with_index do |param, index|
  if param == starting_param
     holding_array.push(h[index..index+2])
  end
end
...