在 C# 中平衡交错数组/列表,同时维护顺序

本文关键字:列表 顺序 维护 数组 平衡 | 更新日期: 2023-09-27 18:35:53

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

在 C# 中平衡交错数组/列表,同时维护顺序

我最终使用了一个贪婪的算法。首先,我从我的目标长度开始,然后尽可能多地添加到每个列表中,而不会超过。然后我使用 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;
    }
}