2016-12-02 61 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]]