时间重叠 区间合并 算法实现 java

0 篇文章 0 订阅



时间重叠 区间合并 算法实现
时间区间,或者数组区间,有需求交叉合并

效果和代码

17:43:17.main-1.[[01:00, 01:55}, [01:20, 01:20}, [02:00, 08:55}, [10:00, 12:55}, [06:00, 09:55}, [15:00, 16:55}, [16:55, 17:55}, [40:00, 42:55}]
17:43:17.main-1.merge [01:00, 01:55} + [01:20, 01:20} -> [01:00, 01:55}
17:43:17.main-1.merge [02:00, 08:55} + [06:00, 09:55} -> [02:00, 09:55}
17:43:17.main-1.merge [15:00, 16:55} + [16:55, 17:55} -> [15:00, 17:55}
17:43:17.main-1.[[01:00, 01:55}, [02:00, 09:55}, [10:00, 12:55}, [15:00, 17:55}, [40:00, 42:55}]



package com.walker.aother;


import com.walker.common.util.Tools;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;


class DeltaBeginEnd<T> {
    T begin;
    T end;

    @Override
    public String toString() {
        return "[" + begin + ", " + end + "}";
    }

    public DeltaBeginEnd<T> setBegin(T begin) {
        this.begin = begin;
        return this;
    }

    public DeltaBeginEnd<T> setEnd(T end) {
        this.end = end;
        return this;
    }

    public static <T> List<DeltaBeginEnd<T>> merge(List<DeltaBeginEnd<T>> list, Comparator<T> comparator) {
        int size = list.size();
        if(size <= 1)
            return list;
        list.sort((o1, o2)-> comparator.compare(o1.begin, o2.begin) );
        List<DeltaBeginEnd<T>> res = new ArrayList<>();
        List<DeltaBeginEnd<T>> copy = new ArrayList<>();
        copy.addAll(list);

        DeltaBeginEnd<T> now = list.get(0);
        copy.remove(now);
        for(int i = 1; i < size; i++){
            DeltaBeginEnd<T> item = list.get(i);
            if(comparator.compare(now.begin, item.end ) > 0|| comparator.compare(now.end, item.begin) < 0) {
            }else{//交集 now 匹配合并 所有其他的 命中则合并移除
                String info = now.toString() + " + " + item.toString();
                now.begin = comparator.compare(item.begin, now.begin) < 0 ? item.begin : now.begin;
                now.end = comparator.compare(item.end, now.end) > 0 ? item.end : now.end;
                copy.remove(item);
                Tools.out("merge " + info + " -> " + now);
            }
        }
        res.add(now);
//        copy中省下的都是跟now无交集的
        res.addAll(merge(copy, comparator));
        return res;
    }

    public static void main(String[] argvs){
        List<DeltaBeginEnd<String>> list = new ArrayList<>();
        list.add(new DeltaBeginEnd<String>().setBegin("01:00").setEnd("01:55"));
        list.add(new DeltaBeginEnd<String>().setBegin("01:20").setEnd("01:20"));
        list.add(new DeltaBeginEnd<String>().setBegin("02:00").setEnd("08:55"));
        list.add(new DeltaBeginEnd<String>().setBegin("10:00").setEnd("12:55"));
        list.add(new DeltaBeginEnd<String>().setBegin("06:00").setEnd("09:55"));
        list.add(new DeltaBeginEnd<String>().setBegin("15:00").setEnd("16:55"));
        list.add(new DeltaBeginEnd<String>().setBegin("16:55").setEnd("17:55"));
        list.add(new DeltaBeginEnd<String>().setBegin("40:00").setEnd("42:55"));

        Tools.out(list);
        Tools.out(merge(list, String::compareTo));
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值