我有一个合同 list ,这些合同都有完成的时间跨度.有些合同比其他合同更重要.如果两个合约之间有重叠,我们就会将不太重要的合约砍成两半,从头开始或从尾砍掉,或者完全取消.
My problem is: I've implemented the algorithm but I still have some minor errors which cause a false output.
e.g.
Input:
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
Output should be:
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
我的代码:
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();
}
Class协定具有属性(开始、结束、价格、优先级)和一个从Icomparable
开始的重写方法,以帮助根据优先级进行排序.
我对获得新的高效和更快的算法也持开放态度,否则修复这个也会很有帮助.
编辑:小通知是,我现在并不关心我输出了多少属性,只要我解决了算法,我就可以处理这些:)