値に基づいて配列をサブ配列に分割する 質問する

値に基づいて配列をサブ配列に分割する 質問する

Ruby Core で配列に相当するものを探していたのですString#splitが、存在しないことに驚きました。値に基づいて配列をサブ配列に分割する、次よりもエレガントな方法はありますか?

class Array
  def split( split_on=nil )
    inject([[]]) do |a,v|
      a.tap{
        if block_given? ? yield(v) : v==split_on
          a << []
        else
          a.last << v
        end
      }
    end.tap{ |a| a.pop if a.last.empty? }
  end
end

p (1..9 ).to_a.split{ |i| i%3==0 },
  (1..10).to_a.split{ |i| i%3==0 }
#=> [[1, 2], [4, 5], [7, 8]]
#=> [[1, 2], [4, 5], [7, 8], [10]]

編集: 興味のある方は、このリクエストのきっかけとなった「現実世界」の問題を以下で見ることができます。この答えここでは、実装に以下の @fd の回答を使用しました。

ベストアンサー1

時々パーティションこのようなことを行うには良い方法です:

(1..6).partition { |v| v.even? } 
#=> [[2, 4, 6], [1, 3, 5]]

おすすめ記事