我有一个对象列表List<object>
,每个对象都有一个与之关联的长度。然后,我可以拥有多个这些对象列表,我想将它们放入另一个具有特定计数的列表或数组中。订单很重要,我需要顶级列表中的每个元素至少包含一个列表。
示例:
list<object> myList1; myList1 count is 4
List<object> myList2; myList2 count is 3
List<object> myList3; myList3 count is 1
List<object> myList4; myList4 count is 20
将所有这些放入一个包含3个元素的数组中(尽可能平衡)
好结果将是[myList1] [myList2,myList3] [myList4]
问题是带有计数20的列表会抛弃我可以做的任何平均值,我必须按顺序保持列表。有没有我可以使用的方法或算法?
答案 0 :(得分:0)
我最终使用了贪心算法。首先,我从目标长度开始,然后尽可能多地添加到每个列表中,而不必过去。然后我用了一个while循环来检查我的顶级列表中是否有太多的Elements,如果我这样做,那么我就增加了目标并重新开始。
double targetLength = System.Math.Round(totalLinecount / (double)displayColumnCount);
while (result.Count != displayColumnCount)
{
result = new List<List<MenuItem>>();
result.Add(new List<MenuItem>());
foreach (MenuItem menuItem in menuItems)
{
int currentLength = result.Last().Count == 0 ? 0 : result.Last().Sum(s => s.TotalLength);
if (result.Last().Count == 0 || (currentLength + menuItem.TotalLength) <= targetLength)
{
result.Last().Add(menuItem);
}
else
result.Add(new List<MenuItem> { menuItem });
}
targetLength++;
if (result.Count <= displayColumnCount)
break;
}
}