ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

ruby 配列を条件で分割

rubyで配列を条件で分割

そんなメソッドがあると思って探した。

partition ? これは、条件に合うもの、合わないものを2つの配列に分ける。

でも、そうじゃない。配列の条件に合うところで、区切りたい。

意外と無いものだ。こんな式になるのかな。

is=ar.map.with_index{|e,i| (e>0)?i:nil}.compact+[ar.size] #仮条件としてe>0

divs=is.each_cons(2).map{|i,j| ar[i,j-i]}

これをメソッドにすると、

class Array
 def divide(&block)
  (self.map.with_index{|e,i| block.call(e)?i:nil}.compact+[self.size])

   .each_cons(2).map{|i,j| self[i,j-i]}
 end
end
print (ar=[-1,1,-3,-5,2,-4,5]).divide(){|e| e>0}

>[[1, -3, -5], [2, -4], [5]]

って感じ。

追記2019.11.01

①配列操作

s=[];[-1,1,-3,-5,2,-4,5].each{|e| if(e>0);s+=[[e]];else;s[-1]+=[e];end};s.shift if s[0][0]<0;p s

>[[1, -3, -5], [2, -4], [5]]

②inject

a=[-1,1,-3,-5,2,-4,5].inject([]){|s,e| j=e<0;s[-1]+=[e] if j;s+=(j)?[]:e};a.shift if a[0][0]<0;p a

>[[1, -3, -5], [2, -4], [5]]

という方法もありました。これなら結構シンプルである。