在 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 的列表会抛弃我能做的任何平均,我必须保持列表的顺序。是否有我可以使用的方法或算法?
我最终使用了一个贪婪的算法。首先,我从我的目标长度开始,然后尽可能多地添加到每个列表中,而不会超过。然后我使用 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;
}
}