我需要找出一种方法来确定多列列表中每列应显示的项目数,以实现最直观的平衡。这是我的标准:
答案 0 :(得分:4)
嗯,你的要求和你的例子看起来有点矛盾。例如,您的第二个示例可以分为两列,每列包含11个项目,并满足您的条件。让我们假设对于规则#2,你的意思是应该有< = 10个项目/列。
此外,我认为您需要添加另一条规则以使要求合理:
The number of columns must not be greater than what is required to accomodate overflow.
否则,您通常会得到退化解决方案,其中您的列数远远超出您的需求。例如,在26个项目的情况下,您可能不希望13列,每列2个项目。
如果是这种情况,这是一个简单的计算,它应该运作良好且易于理解:
int numberOfColumns = CEILING(numberOfItems / 10);
int numberOfItemsPerColumn = CEILING(numberOfItems / numberOfColumns);
现在你将创建N-1列项目(每个都有`numberOfItemsPerColumn),溢出将进入最后一列。根据这个定义,溢出应该在最后一列中最小化。
答案 1 :(得分:1)
如果您想自动确定适当的列数,并且对其限制没有限制,我建议如下:
顺便说一下,常数1.618是Golden Ratio。这将实现比平方更舒适的布局。 对于垂直显示,将另一种方式除以并相乘。 希望这个算法可以帮助任何有类似问题的人。
答案 2 :(得分:0)
以下是您要解决的问题:
最小化y-z,其中n = xy + z且5 <= y <= 10且0 <= z <= y
你有n个项目分为x个项目的x个完整列和z项目的一个剩余列。
几乎可以肯定这是一种聪明的方法,但是考虑到这些限制因素,探索y和z的所有6 + 7 + 8 + 9 + 10 = 40种可能组合的蛮力实施将毫不费力(仅限作业)其中(n - z)mod y = 0是解决方案)。
答案 3 :(得分:0)
考虑到每列项目数量的限制,我认为蛮力解决方案很简单:让v
为每列的项目数(除了最后一列),然后v
属于到[5,10]
,因此可以获得6个不同的值。
评估6个值很容易。 Python单行(或不是到目前为止)来证明它:
# compute the difference between the number of items for the normal columns
# and for the last column, lesser is better
def helper(n,v):
modulo = n % v
if modulo == 0: return 0
else: return v - modulo
# values can only be in [5,10]
# we compute the difference with the last column for each
# build a list of tuples (difference, - number of items)
# (because the greater the value the better, it means less columns)
# extract the min automatically (in case of equality, less is privileged)
# and then pick the number of items from the tuple and re-inverse it
def compute(n): return - min([(helper(n,v), -v) for v in [5,6,7,8,9,10]])[1]
对于77,这产生:7
意味着每列7个项目
对于22,这得到:8
意味着每列8个项目