班次时间段不重复校验

/**
	 * 判断多个时间段是否有重叠(交集)
	 *
	 * @param rangeList 时间段数组
	 * @param isStrict  是否严格重叠,true 严格,没有任何相交或相等;false 不严格,可以首尾相等
	 * @return 返回是否重叠
	 */
	public static boolean isOverlap(List<Range> rangeList, boolean isStrict) {
		rangeList = rangeList.stream().sorted(Comparator.comparingLong(Range::getStart)).collect(Collectors.toList());
		for (int i = 1; i < rangeList.size(); i ++) {
			if (isStrict) {
				if (!(rangeList.get(i - 1).getEnd() < rangeList.get(i).getStart())) {
					return true;
				}
			} else {
				if (!(rangeList.get(i - 1).getEnd() <= rangeList.get(i).getStart())) {
					return true;
				}
			}
		}
		//最后一个班次如果跨天
		if (rangeList.get(rangeList.size() - 1).getEnd() < rangeList.get(rangeList.size() - 1).getStart() && rangeList.get(rangeList.size() - 1).getEnd() > rangeList.get(0).getStart()){
			return true;
		}
		return false;
	}
	
	@Data
	static class Range{
		private Integer sort;
		private long start;
		private long end;
	}
	
	private Range handle(String timeRange){
		String[] rangeArr = timeRange.split("-");
		String startTime = rangeArr[0].trim();
		String endTime = rangeArr[1].trim();
		Range range = new Range();
		Date startDate = null;
		Date endDate = null;
		try {
			startDate = DateUtils.parseDate(startTime, "HH:mm");
			endDate = DateUtils.parseDate(endTime, "HH:mm");
		} catch (Exception e) {
			log.error("时间格式转换异常:" + e.getMessage());
		}
		range.setStart(startDate.getTime());
		range.setEnd(endDate.getTime());
		return range;
	}

	public static void main(String[] args) {
		List<Range> rangeList = Lists.newArrayList();
		List<String> list = new ArrayList<>();
		list.add("0:00-8:00");
		list.add("8:00-18:00");
		list.add("18:30-23:59");
		Demo service = new Demo();
		list.forEach(item -> {
			rangeList.add(service.handle(item));
		});
		if (!CollectionUtils.isEmpty(rangeList)) {
			if (isOverlap(rangeList, false)) {
				System.out.println("时间段有重叠");
			}else{
				System.out.println("时间段没有有重叠");
			}
		}
	}
经验分享 程序员 微信小程序 职场和发展