1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4.  
  5. /**
  6. * 判断多个时间段是否出现重叠
  7. * @author cavancao
  8. */
  9. public class TimeSlotUtil {
  10.  
  11. public static boolean checkOverlap(List<String> list){
  12. Collections.sort(list);//排序ASC
  13.  
  14. boolean flag = false;//是否重叠标识
  15. for(int i=0; i<list.size(); i++){
  16. if(i>0){
  17. //跳过第一个时间段不做判断
  18. String[] itime = list.get(i).split("-");
  19. for(int j=0; j<list.size(); j++){
  20. //如果当前遍历的i开始时间小于j中某个时间段的结束时间那么则有重叠,反之没有重叠
  21. //这里比较时需要排除i本身以及i之后的时间段,因为已经排序了所以只比较自己之前(不包括自己)的时间段
  22. if(j==i || j>i){
  23. continue;
  24. }
  25.  
  26. String[] jtime = list.get(j).split("-");
  27. //此处DateUtils.compare为日期比较(返回负数date1小、返回0两数相等、返回正整数date1大)
  28. int compare = DateUtils.compare(
  29. (DateUtils.getDate()+" "+itime[0]+":00"),
  30. (DateUtils.getDate()+" "+jtime[1]+":00"),
  31. "yyyy-MM-dd HH:mm:ss");
  32. if(compare<0){
  33. flag = true;
  34. break;//只要存在一个重叠则可退出内循环
  35. }
  36. }
  37. }
  38.  
  39. //当标识已经认为重叠了则可退出外循环
  40. if(flag){
  41. break;
  42. }
  43. }
  44.  
  45. return flag;
  46. }
  47.  
  48. public static void main(String[] args) {
  49. List<String> list = new ArrayList<String>();
  50. list.add("08:00-09:00");
  51. list.add("09:00-12:00");
  52. list.add("13:00-16:30");
  53. list.add("16:00-17:00");
  54. list.add("18:00-20:00");
  55.  
  56. boolean flag = checkOverlap(list);
  57. for(String time : list){
  58. System.out.println(time);
  59. }
  60.  
  61. System.out.println("\n当前时间段列表重叠验证结果为:" + flag);
  62. }
  63. }
  1. /*
  2. * TimeSlotUtil.java
  3. * Version 1.0.0
  4. * Created on 2017年12月1日
  5. * Copyright ReYo.Cn
  6. */
  7. package reyo.sdk.utils.test.dy;
  8.  
  9. import java.util.Arrays;
  10.  
  11. /**
  12. * 判断多个时间段是否出现重叠
  13. * @author cavancao
  14. */
  15. class Interval {
  16. int start; //起点
  17. int end; //终点
  18.  
  19. Interval(int a, int b) {
  20. start = a;
  21. end = b;
  22. }
  23. }
  24.  
  25. class Point implements Comparable<Point> {
  26. int value; //数值
  27. int type; //点的类型,0为起点,1为终点
  28.  
  29. Point(int v, int t) {
  30. value = v;
  31. type = t;
  32. }
  33.  
  34. //实现compareTo函数
  35. @Override
  36. public int compareTo(Point p) {
  37. if (this.value == p.value) {
  38. return 0;
  39. } else if (this.value > p.value) {
  40. return 1;
  41. } else {
  42. return -1;
  43. }
  44. }
  45.  
  46. //区间转换
  47.  
  48. }
  49.  
  50. public class TimeSlotUtil2 {
  51.  
  52. public int getOverlappingCount(Interval[] A) {
  53.  
  54. int max = 0, count = 1;
  55.  
  56. if (A == null || A.length == 0)
  57. return max;
  58.  
  59. Point[] points = new Point[A.length * 2];
  60.  
  61. for (int i = 0; i < A.length; i++) {
  62.  
  63. points[2 * i] = new Point(A[i].start, 0);
  64.  
  65. points[2 * i + 1] = new Point(A[i].end, 1);
  66.  
  67. }
  68.  
  69. //Collection.sort(points);
  70.  
  71. Arrays.sort(points);
  72.  
  73. for (int i = 0; i < points.length; i++) {
  74.  
  75. if (points[i].type == 0) {
  76.  
  77. count++;
  78.  
  79. max = Math.max(max, count);
  80.  
  81. } else {
  82.  
  83. count--;
  84.  
  85. }
  86.  
  87. }
  88.  
  89. return max;
  90.  
  91. }
  92.  
  93. public static void main(String[] args) {
  94.  
  95. Interval[] testInterval = new Interval[4];
  96. testInterval[0] = new Interval(1, 5);
  97. testInterval[1] = new Interval(10, 15);
  98. testInterval[2] = new Interval(5, 10);
  99. testInterval[3] = new Interval(20, 30);
  100.  
  101. TimeSlotUtil2 demo = new TimeSlotUtil2();
  102. int max = demo.getOverlappingCount(testInterval);
  103.  
  104. System.out.println(max);
  105.  
  106. }
  107. }

Java判断多个时间段是否重叠(重叠区间个数)的更多相关文章

  1. Java判断一个日期是否在下周日期区间

    Java实现判断一个日期是否在下周日期区间的方法 /** * 判断输入的日期是否在下周区间 * @return * @author nemowang */ public static boolean ...

  2. java 判断两个时间段是不是有交集

    如上图:X Y  Z  分别为传来的开始时间可能位于数据库中时间段的位置. X有三种可能 即传来的开始时间为与数据可中某条数据的开始位置!      这样他的结束时间就有三种可能       1.位于 ...

  3. java 判断两个时间段是否有交集

    /* 开始时间 */ Date leftStartDate = feesPreferential.getPreferentialStartTime(); /* 结束时间 */ Date leftEnd ...

  4. java获取前一天时间SimpleDateFormat,java判断某个时间段

    java获取前一天时间SimpleDateFormat SimpleDateFormat predf = new SimpleDateFormat("yyyy-MM-dd"); D ...

  5. ACdream 1430——SETI——————【后缀数组,不重叠重复子串个数】

    SETI Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statist ...

  6. 使用Java判断字符串中的中文字符数量

    Java判断一个字符串str中中文的个数,经过总结,有以下几种方法(全部经过验证),可根据其原理判断在何种情况下使用哪个方法: 1. char[] c = str.toCharArray(); for ...

  7. Java判断回文数算法简单实现

    好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...

  8. Java 判断操作系统类型(适用于各种操作系统)

    Java 判断操作系统类型(适用于各种操作系统) 最近一段时间写一个授权的程序,需要获取很多信息来保证程序不能随意复制使用,必须经过授权才可以. 为了限制用户使用的操作系统,必须有统一的方法来获取才可 ...

  9. java判断字符串是否为空的方法总结

    http://blog.csdn.net/qq799499343/article/details/8492672 以下是java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观 ...

随机推荐

  1. activiti流程跟踪图算法

    流程跟踪图-推导算法 工作中使用activiti实现流程图相关业务,但是上线后遇到问题,偶尔流程图出不来.查阅了一下画流程图的实现,基本上是参见:activiti-流程图颜色变化之一篇. 核心类,参见 ...

  2. SNMP中MIB2所有主要节点

    系统组:system组包含以下对象集(.1.3.6.1.2.1.1): 对象名:sysDescr(1) OID:system.1 对象类型:DisplayString[255] 访问模式:只读 描述: ...

  3. opencv的级联分类器(mac)

    级联分类器的介绍:级联分类器训练 因为要训练负样本,windows电脑有些问题,所以就只能有mac进行训练. 在windows中训练,准备了负样本之后,进行三步. 1.opencv_createsam ...

  4. 2018-2019-2 网络对抗技术 20165301 Exp1 PC平台逆向破解

    任务一 直接修改程序机器指令,改变程序执行流程 1.输入指令objdump -d pwn5301 | more反汇编pwn1文件. 通过反汇编,可以看到main函数中的call 804891,其机器码 ...

  5. Fiddler 常用功能总结

    1.fiddler相关配置   2.如何抓包 移动端 ①保持手机和电脑处于同一网络中 ②设置手机的代理为电脑当前所处网络的IP,端口号为:8888,eg:10.12.1.64:8888. ③ 启动ap ...

  6. 如何用node.js批量给图片加水印

    上一篇我们讲了如何用node.js给图片加水印,但是只是给某一张图片加,并没有涉及到批量处理.这一篇,我们学习如果批量进行图片加水印处理. 一.准备工作: 首先,你要阅读完这篇文章:http://ww ...

  7. 005.iSCSI客户端配置示例-Windows

    一 环境 Linux作为iSCSI服务端,Windows2008R2作为iSCSI客户端 二 服务端配置过程 2.1 客户端配置 在Linux上参照之前的配置建立三个LUN卷作为共享盘,最终配置如下: ...

  8. 大数据小视角4:小议Lambda 与 Kappa 架构,不可变数据的计算探索

    这个系列文章之前因为私事荒废了很久,继续更新--之前与老大谈论架构时,老大和我聊了聊分布式数据处理之中的Lambda结构,之前在<Designing Data-Intensive Applica ...

  9. TokenAutication源码分析

    创建的token如何交给前端进行使用呢? 在官方文档说明中,将产生的這个token放在header中 TokenAutication认证原理 用户认证成功以后,会在服务端产生一个Token.并且服务端 ...

  10. POJ.1379.Run Away(模拟退火)

    题目链接 POJ输出不能用%lf! mmp从4:30改到6:00,把4:30交的一改输出也过了. 于是就有了两份代码.. //392K 500MS //用两点构成的矩形更新,就不需要管边界了 #inc ...