时间重叠 区间合并 算法实现 java
时间重叠 区间合并 算法实现
时间区间,或者数组区间,有需求交叉合并
效果和代码
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)); } }
上一篇:
IDEA上Java项目控制台中文乱码