2009-12-08 2 views
1

У меня есть набор столбцов различной ширины, и мне нужен алгоритм для их изменения размера для некоторого значения y, которое больше суммы всех их ширины.Алгоритм изменения размера столбцов

Я бы хотел, чтобы алгоритм определял приоритеты выравнивания ширины. Поэтому, если у меня есть значение, которое абсолютно огромно, столбцы будут иметь более или менее одинаковую ширину. Если для этого недостаточно места, я хочу, чтобы меньшие ячейки были отданы предпочтениям.

Любые идеи о шизофрении? Я предпочел бы что-то просто:

getNewWidths(NewWidth, ColumnWidths[]) returns NewColumnWidths[] 

ответ

3

псевдокод:

w = NewWidth 
n = ColumnWidths.count 
sort(ColumnWidths, ascending) 
while n > 1 and ColumnWidths[n-1] > (w/n): 
    w = w - ColumnWidths[n-1] 
    n = n - 1 
for i = 0 to n-1: 
    ColumnWidths[i] = w/n 

Вам нужно добавить код, чтобы перераспределить любые roundoffs из ж/п вычисления, но я думаю, что это будет делать , Ответ

+0

Спасибо. Работает очень хорошо. –

0

Я бы распадаться, что в два этапа, сначала решить, на сколько уравнивания вы хотите (между 0 и 1), и только второй его адаптации к новой общей ширины.

Например, как в

def get_new_widths new_total, widths 
    max = widths.max 
    f = how_much_equalizing(new_total) # return value between 0.0 and 1.0 
    widths = widths.collect{|w| w*(1-f)+max*f} 
    sum = widths.inject(0){|a,b|a+b} 
    return widths.collect{|w| w/sum*new_total} 
end 

def how_much_equalizing new_total 
    return [1.0, (new_total/2000.0)].min 
end 
3

Mark Ransom дает правильный алгоритм, но в случае, если у вас возникли проблемы, выяснить, что там происходит, вот фактическая реализация в Python:

def getNewWidths(newWidth, columnWidths): 
    # First, find out how many columns we can equalize 
    # without shrinking any columns. 
    w = newWidth 
    n = len(columnWidths) 
    sortedWidths = sorted(columnWidths) # A sorted copy of the array. 
    while sortedWidths[n - 1] * n > w: 
     w -= sortedWidths[n - 1] 
     n -= 1 

    # We can equalize the n narrowest columns. What is their new width? 
    minWidth = w // n # integer division 
    sparePixels = w % n # integer remainder: w == minWidth*n + sparePixels 

    # Now produce the new array of column widths. 
    cw = columnWidths[:] # Start with a copy of the array. 
    for i in range(len(cw)): 
     if cw[i] <= minWidth: 
      cw[i] = minWidth 
      if sparePixels > 0: 
       cw[i] += 1 
       sparePixels -= 1 
    return cw 
Смежные вопросы