我正在寻找一种优雅的方法来使用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]]
还有其他优雅的方法来实现这个目标吗?
谢谢!
答案 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的take
和drop
方法:
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的car
和cdr
函数(see details by an anonymous donor),这些字母可以组合成一个控制字符串,有点像APL。希腊语tau(τ)用于表示方法,而不是c
和r
,因此car
,cdr
变为τ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]]