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.maxMath.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");}}}}

答案还是很清晰的哈~

image-20240704103426928

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

时间范围是否重叠判断

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

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

  [{"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");}}}}

image-20240704152655730

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

  [{"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);}@SneakyThrowspublic static long handleDate(String str) {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");return sdf.parse(str).getTime();}

看一下测试结果

image-20240704154200906

总结

实际很简单,就是把需要校验的数据两两比较就可以了,总体思想就是把数据转为数值类型,然后进行比较就可以了。如果对你有帮助,记得点个关注哈~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux配置qqbot(Mirai+Alicebot)

虽然最终没有成功配置好qqbot&#xff0c;但是感觉这个过程还是值得记录的&#xff0c;所以写出了下文 最终因为登陆qq时的code45问题导致没有成功登录&#xff0c;据说更换qq号或者配置签名服务器是有可能可行的。 安装环境 安装mcl&#xff08;mirai的控制台&#xff09; …

【单片机毕业设计选题24046】-基于单片机的智能鱼缸设计

系统功能: 检测水温&#xff0c;水温过低开启PTC加热。检测水位&#xff0c;水位过低开启水泵抽水。检测湿度&#xff0c;湿度过高则开启风扇通风。 检测PH值和浑浊度&#xff0c;TTS语音播报功能&#xff0c;OLED显示系统信息&#xff0c;蓝牙模块连接手机APP。 系统上电后…

IT专业入门,高考假期预习指南—初识产品经理BRD、MRD 和 PRD

七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。作为该领域的前行者和经验前辈&#xff0c;你是否愿意为准新生们提供一份全…

AI 芯片之战:开启智能新时代的关键角逐

在科技发展的浪潮中&#xff0c;一场围绕 AI 芯片的激烈竞争正在全球范围内如火如荼地展开。多家巨头纷纷投身其中&#xff0c;使得这场混战已然进入白热化阶段。 AI 芯片&#xff0c;作为推动人工智能发展的核心硬件&#xff0c;其作用举足轻重。它能够高效地处理海量的数据&a…

生物分子生物学实验过程的自动化与智能监控系统设计

开题报告&#xff1a;生物分子生物学实验过程的自动化与智能监控系统设计 一、引言 随着生物科学技术的飞速发展&#xff0c;生物分子生物学实验在科研、医疗、农业等领域的应用日益广泛。然而&#xff0c;传统的生物分子生物学实验过程大多依赖于人工操作&#xff0c;存在操…

java web 部分

jsp作用域由大到小 过滤器有哪些作用&#xff1f; 过滤器的用法&#xff1f;&#xff08;对客户端的请求统一编码和对客户端进行认证&#xff09; JSP和Servlet中的请求转发分别如何实现&#xff1f; JSP 和 Servlet 有哪些相同点和不同点&#xff0c;他们之间的联系是什么…

PCB设计时,信号走线要先过ESD/TVS管,这是为什么?

目录 为什么有上面这个问题&#xff1f; 问题的原因——走线电感 走线电感的阻抗 电感的影响 小结 都说接口处的信号要先过ESD/TVS管&#xff0c;然后拉到被保护器件&#xff0c;为什么不这样做效果就不好&#xff1f;那如果受板子实际情况限制&#xff0c;必须这样layout…

Python - 单引号与双引号

Python 版本 3.11.4 字符串 单个文字符称为字符&#xff0c;多个文字符成为字符串。 字符串需要被&#xff08;单引号&#xff09;或者""&#xff08;双引号&#xff09;包括。 language "Python"language Python 以上写法都是合法的。 单引号与双…

Zabbix 配置MySQL数据库监控

Zabbix MySQL数据库监控简介 通过 Zabbix 监控 MySQL 数据库&#xff0c;可以获取有关数据库性能、运行状况和资源使用情况的详细信息&#xff0c;帮助及时发现和解决问题。 Zabbix官方提供了一个名为MySQL by Zabbix agent的监控模板&#xff0c;该模板专为 Zabbix 通过 Zabb…

探索Vim表达式寄存器:提升文本处理的高级技巧

探索Vim表达式寄存器&#xff1a;提升文本处理的高级技巧 Vim是一款功能强大的文本编辑器&#xff0c;它拥有丰富的寄存器系统&#xff0c;用于存储文本、命令等。表达式寄存器是Vim中一种特殊的寄存器&#xff0c;允许用户存储并操作表达式的结果。本文将详细介绍如何在Vim中…

使用Spring Boot和mkcert解决本地及局域网HTTPS访问

在现代Web开发中&#xff0c;HTTPS已经成为保障数据传输安全的标准。然而&#xff0c;在开发和测试阶段&#xff0c;配置HTTPS可能会带来一些额外的复杂性。尤其是在本地开发环境和局域网内网环境中&#xff0c;获得和配置证书通常是一个挑战。本文将介绍如何使用Spring Boot和…

关于在自己的生活里面,增加喝咖啡的这道手续

前言&#xff1a;我总在告诉我自己&#xff0c;我自己应该如何&#xff1f;我的未来应该如何&#xff1f;到那时实际上&#xff0c;自己没有办法能够理解的确实我的现在&#xff0c;我应该依靠咖啡度过我自己剩下的岁月&#xff0c;接下来&#xff0c;让自己用自己的方式来不断…

华为5288 V5服务器安装BCLinux8U4手记

本文记录了华为5288 V5服务器安装BCLinux8U4操作系统的过程。 一、系统环境 1、服务器 华为FusionServer Pro 5288 V5服务器 2、操作系统 BCLinux-R8-U4-Server-x86_64-220725.iso 官网下载地址 sha256sum&#xff1a;1d31d3b8e02279e89965bd3bea61f14c65b9d32ad2ab6d4eb…

DTP 抽取出错:data target is locked by process***

怎么会显示被几年前的一个process lock住了呢&#xff1f; 搞不明白。 不管怎样&#xff0c;去RSPM_MONITOR改&#xff0c;data target填上ADSO名&#xff0c;选时间&#xff0c;Process status选Y。 找到这条&#xff0c;双击&#xff0c;发现是active的状态。可能是因为前后…

springboot城市菜园共享系统-计算机毕业设计源码00524

目 录 摘要 1 绪论 1.1 研究背景与意义 1.2 国内外研究现状和发展趋势 1.3论文结构与章节安排 2 城市菜园共享系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.…

Apache Kylin与Impala:深入比较与应用场景分析

Apache Kylin与Impala&#xff1a;深入比较与应用场景分析 在大数据处理领域&#xff0c;Apache Kylin和Impala都是Apache软件基金会下的项目&#xff0c;它们各自提供了独特的解决方案来处理大规模数据集。了解它们的不同之处对于选择合适的数据处理工具至关重要。本文将深入…

[Linux安全运维] rsyslog

rsyslog 1. 什么是 rsyslog rsyslog 是一个高性能的日志处理程序&#xff0c;能够接收、处理并转发日志消息。它被广泛应用于 UNIX 和 Linux 系统中&#xff0c;用于系统日志记录和管理。 2. rsyslog 的主要功能 高性能&#xff1a;能够处理大量日志消息&#xff0c;适用于…

C++那些事之小项目实战-进程间通信

小项目实战之进程间通信 进程间通信是一个非常重要的话题&#xff0c;特别是像一些大型项目都有它的影子&#xff0c;例如&#xff1a;PostgreSQL使用了管道完成copy的进程间通信&#xff0c;那么本节也将基于这个主题&#xff0c;使用C去搭建一个进程间通过管道通信的demo出来…

聚变反应堆设计的一些关键方面和最新进展

聚变反应堆设计是一个复杂且高度专业化的领域&#xff0c;旨在实现核聚变反应以产生清洁能源。以下是对聚变反应堆设计的一些关键方面和最新进展的概述&#xff1a; ### 一、聚变反应堆的基本原理 核聚变是两个较轻的原子核结合成一个较重的原子核&#xff0c;并在此过程中释…

消除笔怎么用?教你消除笔的正确用法

消除笔&#xff0c;也称为橡皮擦工具或克隆笔工具&#xff0c;是图像处理软件中的一种常用工具。它的主要作用是通过取样图像中的某一部分&#xff0c;然后覆盖掉不想要的图像内容&#xff0c;从而实现修复、去除瑕疵等效果。那么有哪些软件具有消除笔功能&#xff0c;又是怎么…