0

我有一个按最近修改日期排序的帖子列表。我想将它们错开成两列,以便将最近修改的两个帖子放在顶部。这段代码是相当不言自明的:

posts.each do |post|
  right_column << post if shift
  left_column << post if !shift
  shift = shift ? false : true
end

posts = left_column + right_column

例如,给定输入 [1, 2, 3, 4],目标是产生[1, 3, 2, 4]

在 Ruby 中是否有更优雅/惯用的方法来实现这一点?

4

2 回答 2

4

用于each_slice获取行,然后transpose将其放入列,然后flatten是它们:

posts = (1..10).to_a  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

posts.each_slice(2).to_a.transpose.flatten
#=> [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

或者,分别获取左右列:

left, right = posts.each_slice(2).to_a.transpose
于 2013-08-03T16:41:35.627 回答
1

更新

我注意到您需要left_column并且 right_column仅作为临时变量。

你可能更喜欢这个

posts = %W{ A B C D E F G H I J}

indices = posts.each_index.partition(&:even?).flatten
posts = posts.values_at(*indices)

p posts

输出

["A", "C", "E", "G", "I", "B", "D", "F", "H", "J"]

如果您使用each_with_index,您可以根据索引是偶数还是奇数推送到不同的数组

posts.each_with_index do |post, i|
  (i.even? ? left_column : right_column) << post
end
于 2013-08-03T16:44:33.823 回答