在ruby中使用索引的分区数组

时间:2013-07-18 15:44:42

标签: ruby

我正在寻找一种优雅的方法来使用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]]

还有其他优雅的方法来实现这个目标吗?

谢谢!

6 个答案:

答案 0 :(得分:10)

你可以这样做:

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

按照@ toro2k的建议,我认为这是一个更好的解决方案,因为你要将两个Enumerators组合起来以获得所需的输出。

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

答案 1 :(得分:6)

为什么不使用array.slice!

  

阵列#切片!删除由索引(可选择长度元素)或范围给出的元素。

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

在你的情况下,

> [a.slice!(0, index), a]

答案 2 :(得分:5)

您可以使用Enumerable的takedrop方法:

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

我做了Enumerable quick reference sheet你可能想咨询这样的问题。

答案 3 :(得分:2)

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

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

由于

答案 4 :(得分: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在集合上提供了许多其他经常遇到的任务。它的灵感来自于lisp的carcdr函数(see details by an anonymous donor),这些字母可以组合成一个控制字符串,有点像APL。希腊语tau(τ)用于表示方法,而不是cr,因此carcdr变为τaττdτ:< / p>

ary.τaτ #=> "a"
ary.τdτ #=> ["b", 3, "c", 5]
# Instead of τfτ, one can write
ary.τdddτ #=> ["c", 5]
etc.

答案 5 :(得分: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]]