1

我正在尝试学习数组处理的Ruby方式。编写以下函数的简洁方法是什么?

def columnize(items, n_cols)

Items 是一个任意长度的一维数组。我想返回一个行数组,每行的长度为n_cols,包括所有items列,可能用nils 填充最后一列。例如:

items = [1, 2, 3, 4, 5, 6, 7]
table = columnize items, 3

这应该产生table

[[1, 4, 7], 
 [2, 5, nil], 
 [3, 6, nil]]

请注意,最后一列可能都是nils,如下所示:

columnize [1, 2, 3, 4, 5, 6, 7, 8, 9], 4

这是我需要为报告生成解决的一个真正问题。我有一个 Ruby 新手解决方案不是很令人满意,如果需要可以发布它。

4

3 回答 3

4

你想使用Matrix类。

items = [1, 2, 3, 4, 5, 6, 7]
require 'matrix'
# ⇒ true
m = Matrix.build(3) { |row, col| items[row+col*3] }
# ⇒ Matrix[[1, 4, 7], [2, 5, nil], [3, 6, nil]]
于 2013-04-02T03:21:11.680 回答
4

Ruby 的 Array 类transpose旨在将行转换为列。将它与fillEnumerable结合使用each_slice会给出:

require 'pp'

def columnize(items, cols)
  ary = items.dup.fill(nil, items.size, cols - items.size % cols )
  ary.each_slice(ary.size / cols).to_a.transpose
end 

items = [1, 2, 3, 4, 5, 6, 7]
pp columnize(items, 3)
pp columnize [1, 2, 3, 4, 5, 6, 7, 8, 9], 4

哪个输出:

[[1, 4, 7], [2, 5, nil], [3, 6, nil]]
[[1, 4, 7, nil], [2, 5, 8, nil], [3, 6, 9, nil]]
于 2013-04-02T07:47:41.393 回答
2

除了填充只有nil元素的行之外,这将执行以下操作:

first, *rest = items.each_slice((items.length/n_cols).ceil).to_a
first.zip(*rest)
于 2013-04-02T03:23:19.033 回答