You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于优先级的合同列表扁平化算法修复与优化需求

合同时间重叠裁剪算法修复与优化需求

我有一批带时间跨度的合同列表,部分合同优先级更高。当合同存在时间重叠时,需要对低优先级合同进行裁剪处理——可以是拆分成两段、截断首尾,或者完全移除。

我已经实现了该算法,但仍存在导致输出错误的问题,示例如下:

输入:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:15:54