我有要按数组arr
中给定的索引进行分组的数组idx
。我是说,
arr
使用当前代码,我可以将第一个子数组的第一个索引为idx
idx [0] =1。
然后,如何复制数组idx
中的所有索引?预先感谢。
我当前的代码和输出是这样:
idx = [1,5,7]
arr = ['a','b','c','d','e','f','g','h','i','j','k']
arr.group_by.with_index { |z, i| i <= idx[0] }.values
=> [["a", "b"], ["c", "d", "e", "f", "g", "h", "i", "j", "k"]]
我想要的输出是这样的:
output --> [["a", "b"], ["c", "d", "e", "f"], ["g", "h"], ["i", "j", "k"]]
#Indexes --> 0 1 2 3 4 5 6 7 8 9 10
您可以通过映射idx
来实现:
idx = [1, 5, 7]
arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
output = (idx + [-1]).map.with_index do |e, index|
start = index.zero? ? 0 : idx[index - 1].succ
arr[start..e]
end
# [["a", "b"], ["c", "d", "e", "f"], ["g", "h"], ["i", "j", "k"]]
您使用idx
中的每个元素表示要从中进行[[slicing arr
的起始元素;对于每个元素,请检查它是否是索引为0的元素,如果是,则将其用作索引以获取数组子集,最后一个元素是当前元素。
idx
中获得前一个元素并加1。接着,无法获得idx
中最后一个元素之后的剩余元素,因此,您可以concat
最后一个元素,这将帮助您从索引7中获得arr
中的元素,直到最后一个。您可以使用-1
(这是最后一个元素)来完成此操作。
所以,您最终会得到类似的东西:
[
[0..1],
[2..5],
[6..7],
[8..-1]
]
足以获得预期输出中的arr
中的元素。您只需要为arr
中的每个元素切片idx
。
idx = [1, 5, 7]
arr = ['a','b','c','d','e','f','g','h','i','j','k']
from = 0
arr.map.with_index { |a, i|
if idx.include?(i)
result = arr[from..i]
from = i + 1
end
result
}.compact
=> [["a", "b"], ["c", "d", "e", "f"], ["g", "h"]]
slice_after
在其索引在slice_after
中的每个项目之后分割数组:idx
不幸的是,idx = [1, 5, 7] arr = %w[a b c d e f g h i j k] arr.enum_for(:slice_after).with_index { |_, i| idx.include?(i) }.to_a #=> [["a", "b"], ["c", "d", "e", "f"], ["g", "h"], ["i", "j", "k"]]
是链接enum_for
和slice_after
所需要的。
with_index
中的每个项目将该数组分成两部分。最后,将元素映射回其原始值。idx