Ruby:从以某个索引为中心的数组中切出n个元素

4
这里有一个数组,一个索引和一个数字n表示我要切片的项数。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
index = 5
n = 3
上述参数可以翻译为“给我中心在索引5周围的3个元素”,这将是[4,5,6]。
如果数字是偶数,则可以任意选择左侧或右侧多余的元素。例如:给定n = 2,[4,5]和[5,6]都是同样有效的。
但我们必须考虑边界情况。假设索引=1且n = 5,则应返回[0,1,2,3,4],因为我们已经到达左侧边界。
同样,假设索引=8且n = 5,则应返回[5,6,7,8,9],因为我们已经到达右侧边界。
如何优雅地编写此代码?
1个回答

4

通过使用 Array#[] 方法可以获取一个片段。

因此,下面的代码应该可以正常工作:

arr[offset - (count / 2), count]

提供的偏移量和计数都是 Fixnums 类型,Ruby 会正确处理除法和四舍五入以满足您的要求。
编辑 | 您应该对算术运算进行清理,因为负偏移对 #slice 有特殊含义。然后,您还需要对结束值进行清理,以使整个计数能够适合。
arr[
  [[offset - (count / 2), 0].max, arr.size - count].min,
  count
]

变得有点棘手了,但总的来说就是这样。

哦,我试图计算左右边界,而不是左(或右)边界应该从哪里开始。现在我明白了。 - MxLDevs
1
是的,你总是想使用偏移/计数操作,而不是范围操作。然后你需要解决的唯一问题就是确定“中心”左侧的最佳边距是多少。 - d11wtq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接