2

我有一个大数组 ,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

4 回答 4

4

您可以使用以下方法获取块#slice_before

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

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

但是,如果您创建了原始数据结构,您可能需要重新考虑您的设计。

于 2011-10-30T02:53:51.940 回答
3

功能方法:

>> 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]
于 2011-10-30T08:38:37.200 回答
2

所以有几个问题。对于初学者,你不能通过做下标数组h.[anything],而且你也是基于值(而不是索引)下标。您还在检查参数是否匹配文字字符串“starting_param”而不是其值。所以我希望你想要的是以下内容:

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

您还会注意到,如果项目位于数组的最后两个槽中,这将环绕并从数组的开头抓取项目(由于 Ruby 如何处理超出范围的数组下标)。

于 2011-10-30T02:54:25.103 回答
1

您也可以使用范围切片操作(我已经稍微更改了变量名,因为骆驼在 ruby​​ 中是不好的风格)

h.each_with_index do |param, index|
  if param == starting_param
     holding_array.push(h[index..index+2])
  end
end
于 2011-10-30T12:11:57.710 回答