gpt4 book ai didi

为设置的表格宽度计算可变列宽的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:39:15 25 4
gpt4 key购买 nike

我需要找出一种算法来计算列宽的优化大小,给定以下条件:

  • 表格的宽度固定为页面的大小
  • 列中的数据是可变的,因此列的宽度是可变的
  • 必须优化宽度以了解何时换行以及何时不换行

所以给定以下数据:

'From' => '03/06/2014',
'To' => '03/06/2014',
'First Name' => 'John Doe',
'Status' => 'approved',
'Type' => 'PTO',
'Amount' => '8 Hours',
'Notes' => 'Oops! Who knew I would need one more day. This should be all I need over the next week to support my trip.'

如何计算最佳列宽,以便“注释”列不会将其他宽度压缩到小于可接受的宽度?

Sample of Problem

更新:我目前知道页面的宽度和字体的宽度,因此我可以计算每列的最大宽度要求。它应该填满页面上的可用空间。但是,除非必要,否则我希望列不要换行。像这样:

enter image description here

最佳答案

一个简单的解决方案是为您的列分配属性;例如,您的 Notes 列可以是 flexible。然后,您可以计算所有行上每列的最大宽度,为所有非灵活列设置该宽度,然后将剩余空间均匀(或可能按最大宽度加权)分配给灵活列。

但您也可以尝试通过一些简单的条件找出属性:

  • 如果列中的任何条目中有空格,则该列可以自动换行。在您的示例中,无法包装日期以及可能的状态和类型条目。名称在正常情况下不应被换行,但如果名称很长或给出了多个名称,则可以被换行。备注栏应该换行。
  • 如果列的最大宽度超过了所有尺寸均匀分布时单元格的宽度,则该列应该是灵活的。

然后按照上面的描述进行:计算所有非灵活列的宽度。检查是否有足够的空间;如果没有,也使可包装列灵活。然后计算柔性单元格的宽度,按其最大宽度加权。

下面是一个可能的伪代码算法。它自由地使用了各种启发式方法,因此您应该对它持保留态度。您可以根据您的用例调整这些条件,但很难满足所有可能的情况。

function layout(table[], width, gutter, col[])

var maxw[col.length] # max. text width over all rows
var maxl[col.length] # max. width of longest word
var flex[col.length] # is column flexible?
var wrap[col.length] # can column be wrapped?
var colw[col.length] # final width of columns

foreach row in table:
for i = 0 to col.length:
cell = row[i]
maxw[i] = max(maxw[i], textwidth(cell))
if cell.find(" "):
maxl[i] = max(maxl[i], wordwidth(cell))

var left = width - (col.length - 1) * gutter
var avg = left / col.length
var nflex = 0

# determine whether columns should be flexible and assign
# width of non-flexible cells

for i = 0 to col.length:
flex[i] = (maxw[i] > 2 * avg) # ???
if flex[i]:
nflex++
else:
colw[i] = maxw[i]
left -= colw[i]

# if there is not enough space, make columns that could
# be word-wrapped flexible, too

if left < nflex * avg:
for i = 0 to col.length:
if !flex[i] and wrap[i]:
left += width[i]
colw[i] = 0
flex[i] = true
nflex += 1

# Calculate weights for flexible columns. The max width
# is capped at the page width to treat columns that have to
# be wrapped more or less equal

var tot = 0
for i = 0 to col.length:
if flex[i]:
maxw[i] = min(maxw[i], width) # ???
tot += maxw[i]

# Now assign the actual width for flexible columns. Make
# sure that it is at least as long as the longest word length

for i = 0 to col.length:
if flex[i]:
colw[i] = left * maxw[i] / tot
colw[i] = max(colw[i], maxl[i])
left -= colw[i]

return colw

关于为设置的表格宽度计算可变列宽的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53601002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com