如何按索引对数组元素进行分组?

问题描述 投票:2回答:4

我有要按数组arr中给定的索引进行分组的数组idx。我是说,

  • 子数组1将在索引1处结束
  • 子数组2将在索引5处结束
  • 子数组3将在索引7处结束
  • 子数组N将从索引8的元素到最后一个元素形成的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  
ruby group-by slice
4个回答
0
投票

您可以通过映射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的元素,如果是,则将其用作索引以获取数组子集,最后一个元素是当前元素。

当索引不为0时,则在idx中获得前一个元素并加1。

接着,无法获得idx中最后一个元素之后的剩余元素,因此,您可以concat最后一个元素,这将帮助您从索引7中获得arr中的元素,直到最后一个。您可以使用-1(这是最后一个元素)来完成此操作。

所以,您最终会得到类似的东西:

[ [0..1], [2..5], [6..7], [8..-1] ]

足以获得预期输出中的arr中的元素。您只需要为arr中的每个元素切片idx

0
投票
另一个解决方案

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"]]


0
投票
您可以使用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_forslice_after所需要的。

0
投票
这里是获得所需结果的另一种选择。该解决方案涉及将每个值映射到其索引。然后针对with_index中的每个项目将该数组分成两部分。最后,将元素映射回其原始值。

idx

© www.soinside.com 2019 - 2024. All rights reserved.