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]]
という方法もありました。これなら結構シンプルである。