Ruby each_slice具有不同的大小

时间:2016-12-02 04:02:54

标签: arrays ruby 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将带我参与其中。我无法弄清楚如何一路走到我需要的地方。

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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

答案 2 :(得分:0)

Array#conditional_slice方法接受一个Block并返回一个Enumerator:

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