Разделите @blogs на три деления, используя размер поля описания в качестве веса - PullRequest
2 голосов
/ 11 октября 2010

У меня есть коллекция элементов блога.

@blogs = Blog.find(:all)

В каждом блоге есть текстовое поле с описанием текста. Я хотел бы разбить объекты @blogs на 3 элемента div, но с примерно одинаковыми символами в каждом столбце.

<div id="left">
  #blog1 (653 characters)
</div>

<div id="center">
  #blog2 (200 characters)
  #blog5 (451 characters)
</div>

<div id="right">
  #blog3 (157 characters)
  #blog4 (358 characters)
  #blog6 (155 characters)
</div>

Я не могу понять, как это сделать, не становясь действительно сложным и, вероятно, неэффективным.

До сих пор я думал о преобразовании поля описания (размера) в% от общего количества символов в коллекции @blogs, но как мне сопоставить / разделить элементы, чтобы в каждом столбце я был ближе к 33% - как супер простая игра тетрис:)

Есть мысли?

1 Ответ

1 голос
/ 17 марта 2011

Вот быстрый взлом, который не идеален, но может приблизить вас. Алгоритм прост:

  1. Сортировка элементов по размеру.
  2. Разделить элементы на N корзин.
  3. Курс каждой корзины по дате (или другому полю, в соответствии с желаемым порядком представления)

Вот краткое доказательство концепции:

#!/usr/bin/env ruby

# mock out some simple Blog class for this example
class Blog
  attr_accessor :size, :date

  def initialize
    @size = rand(700) + 100
    @date = Time.now + rand(1000)
  end
end

# create some mocked data for this example
@blogs = Array.new(10) { Blog.new }

# sort by size
sorted = @blogs.sort_by { |b| b.size }

# bin into NumBins
NumBins = 3
bins = Array.new(NumBins) { Array.new }
@blogs.each_slice(NumBins) do |b|
  b.each_with_index { |x,i| bins[i] << x }
end

# sort each bin by date
bins.each do |bloglist|
  bloglist.sort_by! { |b| b.date }
end

# output
bins.each_with_index do |bloglist,column|
  puts
  puts "Column Number: #{column+1}"
  bloglist.each do |b|
    puts "Blog: Size = #{b.size}, Date = #{b.date}"
  end
  total = bloglist.inject(0) { |sum,b| sum + b.size }
  puts "TOTAL SIZE: #{total}"
end

Чтобы получить больше идей, найдите проблему многопроцессорное планирование .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...