Вот мое решение. Он берет массив, скажем ["a", "b", "c", "d"]
, и преобразует его в этот массив: [["a", "b"], ["c"], ["d"]]
, который затем легко использовать для отображения данных в столбцах.
def categories_in_columns(categories, number_of_groups=3)
groups = []
elements_per_column = categories.size / number_of_groups
extra_elements = categories.size % number_of_groups
has_extra_elements = (extra_elements > 0 ? 1 : 0)
0.upto(number_of_groups-1).each do |i|
groups[i] = []
while groups[i].size < (elements_per_column + has_extra_elements)
groups[i] << categories.shift
extra_elements -= 1 if groups[i].size > elements_per_column
end
has_extra_elements = 0 if extra_elements == 0
groups[i].compact!
end
groups.delete_if { |i| i.empty? }
end
И спецификации для него:
it "arranges categories into columns" do
categories_in_columns(["a", "b", "c", "d", "e"]).should == [["a", "b"], ["c", "d"], ["e"]]
categories_in_columns(["a", "b", "c", "d"] ).should == [["a", "b"], ["c"], ["d"]]
categories_in_columns(["a", "b", "c"] ).should == [["a"], ["b"], ["c"]]
categories_in_columns(["a", "b"] ).should == [["a"], ["b"]]
categories_in_columns(["a"] ).should == [["a"]]
end