2016-12-02 29 views
1

我:红宝石each_slice不同尺寸

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

号进来二的倍数的群体,和信件进来四的倍数的群体。

我想三三两两组数字和字母四肢像这样:

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]] 

Enumerable#slice_when,首先出现在Ruby中V2.2。

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]]