基于优先级的合同列表扁平化算法修复与优化需求
合同时间重叠裁剪算法修复与优化需求
我有一批带时间跨度的合同列表,部分合同优先级更高。当合同存在时间重叠时,需要对低优先级合同进行裁剪处理——可以是拆分成两段、截断首尾,或者完全移除。
我已经实现了该算法,但仍存在导致输出错误的问题,示例如下:
输入:
Start Ende Preis Priorität
1.1.2020 1.3.2020 20,40 1
1.2.2020 31.12.2020 18,00 2
1.6.2020 1.9.2020 16,90 3
预期输出:
Start Ende Preis
1.1.2020 31.1.2020 20,40
1.2.2020 31.5.2020 18,00
1.6.2020 1.9.2020 16,90
2.9.2020 31.12.2020 18,00
我的C#代码如下:
List<Contract> contractList = //get value based on a file and get sorted based on the priority; List<Contract> resultContracts = new List<Contract>() { contractList[0] }; int n = contractList.Count; for (var i = 0; i < contractList.Count; i++) { var lastProcessedContract = contractList[i]; // high priority var contractsToRemove = new List<Contract>(); var contractsToAdd = new List<Contract>(); for (var j = i + 1; j < contractList.Count; j++){ var lessPriorityContract = contractList[j]; if (contractList[j].priority == contractList[i].priority) { continue; } if (lessPriorityContract.start >= lastProcessedContract.start && lessPriorityContract.end <= lastProcessedContract.end) /* * ------------------------> * ------> * oder * ------------------------> * --------> * oder * -------------------------> * -------> * oder * ---------------------------> * ---------------------------> */ { contractsToRemove.Add(lessPriorityContract); } else if ((lessPriorityContract.start < lastProcessedContract.start && (lessPriorityContract.end > lastProcessedContract.start && lessPriorityContract.end <= lastProcessedContract.end)) || ((lastProcessedContract.start < lessPriorityContract.end && lastProcessedContract.start > lessPriorityContract.start) && lastProcessedContract.end > lessPriorityContract.end)) /* * ------------------------> * ------> * oder * -------------------------------> * -----------------------------------> // oder * ---------------> * ------------------------> */ { lessPriorityContract.end = lastProcessedContract.start.AddDays(-1); resultContracts.Add(lessPriorityContract); } else if (((lessPriorityContract.start < lastProcessedContract.end && lessPriorityContract.start >= lastProcessedContract.start) && lessPriorityContract.end > lastProcessedContract.end) || (lastProcessedContract.start < lessPriorityContract.start && (lastProcessedContract.end > lessPriorityContract.start && lastProcessedContract.end < lessPriorityContract.end))) /* * --------------------> * -------------------------> * oder * --------------------> * ----------------------------------> * //oder * ------------> * -------------------> * */ { lessPriorityContract.start = lastProcessedContract.end.AddDays(1); resultContracts.Add(lessPriorityContract); } else if(lessPriorityContract.start < lastProcessedContract.start && lessPriorityContract.end > lastProcessedContract.end) /* * ------------> * ---------------------------> * oder * ---------------------------> * ---------------------------> * */ { contractsToRemove.Add(lessPriorityContract); var contract = new Contract { start = lessPriorityContract.start, end = lastProcessedContract.start.AddDays(-1), priority = lessPriorityContract.priority, price = lessPriorityContract.price }; contractsToAdd.Add(contract); //contractList.Remove(contractList[i]); //contractList.Add(contract); resultContracts.Add(contract); contract = new Contract { start = lastProcessedContract.end.AddDays(1), end = lessPriorityContract.end, priority = lessPriorityContract.priority, price = lessPriorityContract.price }; resultContracts.Add(contract); contractsToAdd.Add(contract); //contractList.Add(contract); } else { resultContracts.Add(lessPriorityContract); } } foreach (var contractToRemove in contractsToRemove) { contractList.Remove(contractToRemove); resultContracts.Remove(contractToRemove); } foreach (var contractToAdd in contractsToAdd) { contractList.Add(contractToAdd); } contractList.Sort(); } resultContracts.Sort(new ContractComparer()); // Sorting based on start time of the contract resultContracts = resultContracts.Distinct().ToList(); foreach (var flatElement in resultContracts) { Console.WriteLine(flatElement.ToString()); Console.WriteLine(); } resultContracts.Sort(); Console.WriteLine("-------------------------------"); foreach (var flatElement in resultContracts) { Console.WriteLine(flatElement.ToString()); Console.WriteLine(); }
Contract类包含start、end、price、priority属性,并重写了IComparable接口的方法以实现按优先级排序。
我希望能修复现有代码中的错误,或者获取更高效的算法方案。注:目前暂不关注输出属性数量,只需解决算法问题。
内容的提问来源于stack exchange,提问作者Mouad Meziani
相关产品推荐
相关产品推荐

