Java判断范围型的数据是否存在重叠的方法

 更新时间:2024年07月08日 11:01:09   作者:笑小枫  
遇到了个问题,同一天可以输入多个时间段,但是每个时间段的时间不能出现重叠,这不就是判断数据返回是否有重叠的变种吗,所以本文给大家介绍了Java判断范围型的数据是否存在重叠的方法,需要的朋友可以参考下

为什么写这么一篇文章呢?

遇到了个问题,同一天可以输入多个时间段,但是每个时间段的时间不能出现重叠。

纳尼,这不就是判断数据返回是否有重叠的变种嘛~

简单,开搞

数字范围是否重叠判断

这里以int类型为例了,其它的也都类似

核心方法

    /**
     * @param start1 第一个数据开始时间
     * @param end1   第一个数据结束时间
     * @param start2 第二个数据开始时间
     * @param end2   第二个数据结束时间
     * @return true:发生重叠  false:未发生重叠
     */
    public static boolean isIntersect(int start1, int end1, int start2, int end2) {
        return Math.max(start1, start2) <= Math.min(end1, end2);
    }

4个参数start1-end1代表第一组范围,start2-end2代表第二组范围;

Math.max(start1, start2) <= Math.min(end1, end2)使用Math.max和Math.min可以无视第一组数据和第二组数据的顺序,只比较是否重叠,<= 代表0-1后面不能是1-3,只能是2-3;如果想要1-3的效果把=去掉即可,后面会有演示。

核心方法非常简单,那我们造一组伪数据测试一下吧。

测试数据

先来一组错误数据吧

[
  {"startNum": 0, "endNum": 100},
  {"startNum": 100, "endNum": 500},
  {"startNum": 400, "endNum": 1000},
  {"startNum": 1001, "endNum": 9999}
]

测试方法

    public static void main(String[] args) {
        String str = "[\n" +
                "  {\"startNum\": 0, \"endNum\": 100},\n" +
                "  {\"startNum\": 100, \"endNum\": 500},\n" +
                "  {\"startNum\": 500, \"endNum\": 1000},\n" +
                "  {\"startNum\": 1001, \"endNum\": 9999}\n" +
                "]";
        JSONArray array = JSON.parseArray(str);
        for (int i = 0; i < array.size(); i++) {
            for (int j = i + 1; j < array.size(); j++) {
                boolean isOk = isIntersect(
                        handleStr(array.getJSONObject(i).getString("startNum")),
                        handleStr(array.getJSONObject(i).getString("endNum")),
                        handleStr(array.getJSONObject(j).getString("startNum")),
                        handleStr(array.getJSONObject(j).getString("endNum")));
                if (isOk) {
                    System.out.println("no " + j + " and no " + (j + 1) + " is intersect");
                    System.out.println("or say, "
                            + array.getJSONObject(i).getString("startNum")
                            + " to " + array.getJSONObject(i).getString("endNum")
                            + " and " + array.getJSONObject(j).getString("startNum")
                            + " to " + array.getJSONObject(j).getString("endNum")
                            + " is intersect");

                    System.out.println("\n");
                }
            }
        }
    }

答案还是很清晰的哈~

数字范围效果完成了。数值类的都类似哈

时间范围是否重叠判断

时间有很多种,我们一种一种的来说,实现都一样,重要的是思想

首先来看一下下面这种格式,搞个错误数据吧

  [
    {"startTime": "00:00", "endTime": "01:00"},
    {"startTime": "01:00", "endTime": "02:00"},
    {"startTime": "01:00", "endTime": "02:00"},
    {"startTime": "08:00", "endTime": "22:00"},
    {"startTime": "20:00", "endTime": "24:00"}
  ]

因为01:00是重叠的,所以我们把上面核心方法的=去掉。如下

    /**
     * @param start1 第一个数据开始时间
     * @param end1   第一个数据结束时间
     * @param start2 第二个数据开始时间
     * @param end2   第二个数据结束时间
     * @return true:发生重叠  false:未发生重叠
     */
    public static boolean isIntersect(int start1, int end1, int start2, int end2) {
        return Math.max(start1, start2) < Math.min(end1, end2);
    }

接下来就很简单了,把时间处理成数据类型就可以了,下面看一下处理的方法

    public static int handleStr(String str) {
        str = str.replace(":", "");
        return Integer.parseInt(str);
    }

来一起看一下运行结果吧

    public static void main(String[] args) {
        String data = "  [\n" +
                "    {\"startTime\": \"00:00\", \"endTime\": \"01:00\"},\n" +
                "    {\"startTime\": \"01:00\", \"endTime\": \"02:00\"},\n" +
                "    {\"startTime\": \"01:00\", \"endTime\": \"02:00\"},\n" +
                "    {\"startTime\": \"08:00\", \"endTime\": \"22:00\"},\n" +
                "    {\"startTime\": \"20:00\", \"endTime\": \"24:00\"}\n" +
                "  ]";
        JSONArray array = JSON.parseArray(data);
        for (int i = 0; i < array.size(); i++) {
            for (int j = i + 1; j < array.size(); j++) {
                boolean isOk = isIntersect(
                        handleStr(array.getJSONObject(i).getString("startTime")),
                        handleStr(array.getJSONObject(i).getString("endTime")),
                        handleStr(array.getJSONObject(j).getString("startTime")),
                        handleStr(array.getJSONObject(j).getString("endTime")));
                if (isOk) {
                    System.out.println("no " + j + " and no " + (j + 1) + " is intersect");
                    System.out.println("or say, "
                            + array.getJSONObject(i).getString("startTime")
                            + " to " + array.getJSONObject(i).getString("endTime")
                            + " and " + array.getJSONObject(j).getString("startTime")
                            + " to " + array.getJSONObject(j).getString("endTime")
                            + " is intersect");

                    System.out.println("\n");
                }
            }
        }
    }

对于时间类型,下面格式如何比较

  [
    {"startTime": "2024-07-04 00:00:00", "endTime": "2024-07-04 10:00:00"},
    {"startTime": "2024-07-04 10:00:00", "endTime": "2024-07-04 12:00:00"},
    {"startTime": "2024-07-04 12:00:00", "endTime": "2024-07-04 13:00:00"},
    {"startTime": "2024-07-04 12:00:00", "endTime": "2024-07-04 18:00:00"},
    {"startTime": "2024-07-04 17:00:00", "endTime": "2024-07-04 23:00:00"}
  ]

其实直接将时间转为时间戳来比较就可以了,完整代码如下:

    public static void main(String[] args) {
        String data = "[\n" +
                "    {\"startTime\": \"2024-07-04 00:00:00\", \"endTime\": \"2024-07-04 10:00:00\"},\n" +
                "    {\"startTime\": \"2024-07-04 10:00:00\", \"endTime\": \"2024-07-04 12:00:00\"},\n" +
                "    {\"startTime\": \"2024-07-04 12:00:00\", \"endTime\": \"2024-07-04 13:00:00\"},\n" +
                "    {\"startTime\": \"2024-07-04 12:00:00\", \"endTime\": \"2024-07-04 18:00:00\"},\n" +
                "    {\"startTime\": \"2024-07-04 17:00:00\", \"endTime\": \"2024-07-04 23:00:00\"}\n" +
                "  ]";
        JSONArray array = JSON.parseArray(data);
        for (int i = 0; i < array.size(); i++) {
            for (int j = i + 1; j < array.size(); j++) {
                boolean isOk = isIntersect(
                        handleDate(array.getJSONObject(i).getString("startTime")),
                        handleDate(array.getJSONObject(i).getString("endTime")),
                        handleDate(array.getJSONObject(j).getString("startTime")),
                        handleDate(array.getJSONObject(j).getString("endTime")));
                if (isOk) {
                    System.out.println("no " + j + " and no " + (j + 1) + " is intersect");
                    System.out.println("or say, "
                            + array.getJSONObject(i).getString("startTime")
                            + " to " + array.getJSONObject(i).getString("endTime")
                            + " and " + array.getJSONObject(j).getString("startTime")
                            + " to " + array.getJSONObject(j).getString("endTime")
                            + " is intersect");

                    System.out.println("\n");
                }
            }
        }
    }

    /**
     * @param start1 第一个数据开始时间
     * @param end1   第一个数据结束时间
     * @param start2 第二个数据开始时间
     * @param end2   第二个数据结束时间
     * @return true:发生重叠  false:未发生重叠
     */
    public static boolean isIntersect(long start1, long end1, long start2, long end2) {
        return Math.max(start1, start2) < Math.min(end1, end2);
    }

    @SneakyThrows
    public static long handleDate(String str) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.parse(str).getTime();
    }

看一下测试结果

总结

到此这篇关于Java判断范围型的数据是否存在重叠的方法的文章就介绍到这了,更多相关Java判断数据是否重叠内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC中的Model对象用法说明

    SpringMVC中的Model对象用法说明

    这篇文章主要介绍了SpringMVC中的Model对象用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java多线程之循环栅栏技术CyclicBarrier使用探索

    Java多线程之循环栅栏技术CyclicBarrier使用探索

    这篇文章主要介绍了Java多线程之循环栅栏技术CyclicBarrier,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2024-01-01
  • 关于Java中Bean的生命周期详解

    关于Java中Bean的生命周期详解

    这篇文章主要介绍了关于Java中Bean的生命周期详解,所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期,需要的朋友可以参考下
    2023-08-08
  • java Mail邮件接收工具类

    java Mail邮件接收工具类

    这篇文章主要介绍了java Mail邮件接收工具类,本文直接给出类实现代码和使用示例,需要的朋友可以参考下
    2015-02-02
  • 简单谈谈Struts动态表单(DynamicForm)

    简单谈谈Struts动态表单(DynamicForm)

    下面小编就为大家带来一篇简单谈谈Struts动态表单(DynamicForm)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • IntelliJ IDEA 代码运行时中文出现乱码问题及解决方法

    IntelliJ IDEA 代码运行时中文出现乱码问题及解决方法

    在我们刚接触到IDEA时,想美滋滋的敲一个“hello world”来问候这个世界,但难免会遇到这种问题乱码,这篇文章主要介绍了解决IntelliJ IDEA 代码运行时中文出现乱码问题,需要的朋友可以参考下
    2023-09-09
  • Java中的runnable 和 callable 区别解析

    Java中的runnable 和 callable 区别解析

    Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnable适用于简单的后台任务和定时任务,而Callable适用于并行计算、异步操作和复杂任务,选择使用哪个接口取决于具体的应用场景,感兴趣的朋友一起看看吧
    2025-03-03
  • java web中的servlet3 upload上传文件实践

    java web中的servlet3 upload上传文件实践

    这篇文章主要介绍了servlet3 upload上传文件实践,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • java自定义任务类定时执行任务示例 callable和future接口使用方法

    java自定义任务类定时执行任务示例 callable和future接口使用方法

    Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务
    2014-01-01
  • Spring自定义配置Schema可扩展(一)

    Spring自定义配置Schema可扩展(一)

    本教程主要介绍如何扩展Spring的xml配置,让Spring能够识别我们自定义的Schema和Annotation,,需要的朋友可以参考下
    2016-01-01

最新评论