Arrays 按条件的块数组
我有这样的数组Arrays 按条件的块数组,arrays,ruby,Arrays,Ruby,我有这样的数组 [["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"], ["ROW3", "seven"], ["End", nil], ["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"], ["End", nil], ["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"], ["End", nil]] 如果数组由“Page”
[["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"], ["ROW3", "seven"], ["End", nil], ["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"], ["End", nil], ["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"], ["End", nil]]
如果数组由“Page”组成,我想将内部数组插入另一个数组中,并且当数组有“End”时我已经停止,因此结果数组必须是
[
[["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"], ["ROW3", "seven"], ["End", nil]],
[["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"], ["End", nil]],
[["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"], ["End", nil]]
]
我尝试使用ruby的触发器操作符,但由于它有多个端点,它占用了整个数组,因此无法工作。在ruby中还有其他方法可以实现这一点吗?您的直觉是正确的:这对于操作员来说是一个很好的应用程序。如果
arr
是您的数组,则可以编写以下代码
your_array
.chunk { |ary| ary.first.match?("Page") }
.each_slice(2)
.map { |group| group.flat_map(&:last) }
#=> [
# [["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"], ["ROW3", "seven"], ["End", nil]],
# [["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"], ["End", nil]],
# [["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"], ["End", nil]]
# ]
arr.slice_after { |f,_| true if f=='End' .. f=='End' }.to_a
#=> [
# [["Page_1", nil], ["ROW1", "one"], ["ROW2", "four"],
# ["ROW3", "seven"], ["End", nil]],
# [["Page_2", nil], ["ROW4", "Ten"], ["ROW5", "thirteen"],
# ["End", nil]],
# [["Page_4", nil], ["ROW6", "Sixteen"], ["ROW7", "Nineteen"],
# ["End", nil]]
# ]
触发器在f=='End'
时打开,导致true
返回到块,然后,在数组的下一个元素传递到块之前,它检查结束条件,f=='End'
,导致触发器关闭,使“false”返回到块,直到数组的后续元素的f==“End”
为true
还有一种方法
arr.each_with_object([[]]) do |pair,a|
a[-1] << pair
a << [] if pair.first == "End"
end.tap { |a| a.pop if a[-1].empty? }
arr.each_with_object([[])do | pair,a|
a[-1]以迭代方式思考,您希望1)有一个(空)结果变量2)在数组中迭代,2a)在数组的某个感兴趣区域中时记忆2b)通过存储开始(和结束位置)和2c)将感兴趣区域添加到结果中。到底出了什么问题?数组或可枚举中的哪些方法对你来说是有趣的?Chunk方法,是的,我期待一个类似这样的预定义方法。太棒了!实际上,match?
方法对我不起作用,所以我使用了include?
,我使用的是Ruby 2.3.3。这就是原因吗?@Rajagopalan是的,我认为String#match?
是在2.4左右添加的(你应该升级你的版本),我知道你会想出不同的解决方案。我犯了一个错误,在触发器操作符中给出了page和end。你找对人了。太好了,谢谢你。