8

我正在寻找一种通过在 ruby​​ 中使用索引来分区数组的优雅方法

例如:

["a","b",3,"c",5].partition_with_index(2) 
    => [["a","b",3],["c",5]]

到目前为止,我能想到的最好的方法是使用下面的

["a","b",3,"c",5].partition.each_with_index{|val,index| index <= 2}
    => [["a","b",3],["c",5]]

有没有其他优雅的方式来实现这一点?

谢谢!

4

6 回答 6

14

你可以做:

["a","b",3,"c",5].partition.with_index { |_, index| index <= 2 }

遵循@toro2k 的建议,我认为这是一个更好的解决方案,因为您将两者结合Enumerators以获得所需的输出。

如果您不将代码块传递给partition,则它会返回一个Enumerator对象。Enumerators有一个with_index方法可以保持当前循环索引。

于 2013-07-18T15:56:38.527 回答
9

你为什么不使用array.slice!

数组#切片!删除由索引(可选到长度元素)或范围给定的元素。

> a = ['a', 'b', 'c', 5]
> b = a.slice! 0, 2 # => ['a', 'b'] 
> a # => ['c', 5]

在你的情况下,

> [a.slice!(0, index), a]
于 2013-07-18T15:59:50.557 回答
6

您可以使用 Enumerable 的takedrop方法:

a = ["a","b",3,"c",5]
[a.take(3), a.drop(3)]  # => [["a", "b", 3], ["c", 5]]

我制作了一个Enumerable 快速参考表,您可能想咨询此类问题。

于 2013-07-18T16:23:08.993 回答
2

这可以做到,但不确定它是否优雅:

a = ["a","b",3,"c",5]
index = 2
[a[0..index], a[index+1..-1]]

谢谢

于 2013-07-18T15:53:34.940 回答
0

对于您的特定情况,'pyper' gem 是可用的:

require 'pyper' # gem install pyper if necessary
include Pyper

ary = ["a", "b", 3, "c", 5]
ary.τ3τ #=> ["a", "b", 3]
ary.τfτ #=> ["c", 5]

它只适用于小 n(切掉元素的数量),但Pyper提供了许多其他经常遇到的关于集合的任务。它的灵感来自 lispcarcdr函数(请参阅匿名捐赠者的详细信息),并且可以将字母组合成一个控制字符串,有点像 APL。希腊语 tau (τ) 用于表示方法,而不是cand r,因此car,cdr变成τaτ, τdτ

ary.τaτ #=> "a"
ary.τdτ #=> ["b", 3, "c", 5]
# Instead of τfτ, one can write
ary.τdddτ #=> ["c", 5]
etc.
于 2013-07-18T16:56:06.503 回答
0

您可以尝试以下方法:

a = ["a","b",3,"c",5]
par = a.slice_before(sum: -2) do |elem, state|
  state[:sum] += 1
  state[:sum] == 2
end.to_a
par
# => [["a", "b", 3], ["c", 5]]
于 2013-07-18T19:02:15.217 回答