0

我有一个对象列表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 的列表会抛出我能做的任何平均,我必须保持列表井井有条。有没有我可以使用的方法或算法?

4

1 回答 1

0

我最终使用了一个贪心算法。首先,我从目标长度开始,然后尽可能多地添加到每个列表中,而不会超过。然后我使用了一个while循环来检查我的顶级列表中是否有太多元素,如果有,我就增加目标并重新开始。

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;
    }
}
于 2013-10-23T15:43:51.773 回答