2016-12-02 3 views
1

は私が持っている:Rubyのeach_sliceは

stuff = [1, 2, "a", "b", "c", "d", 4, 5, "z", "l", "m", "l", 5, 4, 4, 77] 

数は2の倍数のグループで来て、手紙は4の倍数のグループで来ます。

私はこのような四つんばいで補数と文字のグループ番号にしたい:

stuff_processed = [ 
    [1, 2], 
    ["a", "b", "c", "d"], 
    [4, 5], 
    ["z", "l", "m", "l"], 
    [5, 4], 
    [4, 77] 
] 

ための数字や文字を保持する配列の内部には、私は気にしないアレイ間の順序が重要です。

私が知っているのはstuff.each_slice(2).to_aです。私はどのように私が必要なものにすべての方法を得るかを把握することはできません。

答えて

2
stuff 
.chunk(&:class) 
.flat_map{|klass, a| a.each_slice(klass == Fixnum ? 2 : 4).to_a} 
# => [[1, 2], ["a", "b", "c", "d"], [4, 5], ["z", "l", "m", "l"], [5, 4], [4, 77]] 
0
arr = [1, 2, "a", "b", "c", "d", 4, 5, "z", "l", "m", "l", "s", "t", 
     "u", "v", 5, 4, 4, 77, 91, 65] 

H = { Fixnum=>1, String=>3 } 
count = 0 
arr.slice_when do |a,b| 
    if a.class == b.class && count < H[a.class] 
    count += 1 
    false 
    else 
    count = 0 
    true 
    end 
end.to_a 
    # => [[1, 2], ["a", "b", "c", "d"], [4, 5], ["z", "l", "m", "l"], 
    #  ["s", "t", "u", "v"], [5, 4], [4, 77], [91, 65]] 

最初のRuby V2.2に登場Enumerable#slice_whenを参照してください。

0

このArray#conditional_slice方法は、ブロックを受け入れ、列挙子を返し:

stuff = [1, 2, "a", "b", "c", "d", 4, 5, "z", "l", "m", "l", 5, 4, 4, 77] 

class Array 
    def conditional_slice(&block) 
    clone = self.dup 
    Enumerator.new do |yielder| 
     until clone.empty? do 
     yielder << clone.shift(block_given? ? block.call(clone.first) : 1) 
     end 
    end 
    end 
end 

sliced_stuff = stuff.conditional_slice{|x| x.is_a?(Numeric) ? 2 : 4} 

puts sliced_stuff.to_a.inspect 
# => [[1, 2], ["a", "b", "c", "d"], [4, 5], ["z", "l", "m", "l"], [5, 4], [4, 77]]