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,一经查实,立即删除!

相关文章

【单片机毕业设计选题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…

Zabbix 配置MySQL数据库监控

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

华为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.…

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

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

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

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

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决. 基…

欧洲杯:高精度定位技术,重塑体育赛事新体验

随着科技的飞速发展&#xff0c;体育赛事的观赏体验与竞技水平正被不断推向新的高度。在即将到来的2024年欧洲杯赛场上&#xff0c;一项革命性的技术——高精度定位&#xff0c;正悄然改变着比赛的每一个细节&#xff0c;为球迷们带来前所未有的观赛享受&#xff0c;同时也为运…

昇思25天学习打卡营第7天|保存与加载

Python语言 AI框架&#xff1a;Mindspore 1.模型构建 class Network(nn.Cell):def __init__(self):super().__init__()self.flatten nn.Flatten()self.dense_relu_sequential nn.SequentialCell(nn.Dense(28*28, 512, weight_init"normal", bias_init"zeros…

力扣双指针算法题目:移动零

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 这个题目的思路和“使用递归排序快速排序解决数组的排序问题”相同 class solution { public:void QuickSort(vector<int>& nums, int left, int right){if (left > right) return;int key left…

VSCode常用的一些插件

Chinese (Simplified) 汉语&#xff08;简体&#xff09;拓展包。 Auto Close Tag 可以自动增加xml/html的闭合标签。 CodeSnap 截图神器。截图效果在下面。 Dracula Official vscode一个很好看的主题。 Git Graph git管理工具。 GitHub Repositories 有了它&#xff0c;不…

AI一键音频转文字工具 速度超快,支持实时转换,无需联网,本地整合包下载

这是 CapsWriter-Offline &#xff0c;一个 PC 端的语音输入、字幕转录工具。可用实现简单一键将音频文件转换成文字的懒人工具。 两个功能&#xff1a; 1、实时转换&#xff0c;按下键盘上的 大写锁定键&#xff0c;录音开始&#xff0c;当松开 大写锁定键 时&#xff0c;就会…

TaskDisplayArea、ActivityStack、Task以及ActivityRecord之间的关系

目录 一、TaskDisplayArea、ActivityStack、TaskRecord以及ActivityRecord关系图 二、TaskDisplayArea、ActivityStack、Task以及ActivityRecord相关代码 1、ActivityRecord 2、Task 3、ActivityStack 4、TaskDisplayArea 前言&#xff1a;对TaskDisplayArea、ActivitySt…

go语言day08 泛型 自定义错误处理 go:协程

泛型&#xff1a; 抛错误异常 实现error接口类型 用java语言解释的话&#xff0c;实现类需要重写error类型的抽象方法Error().这样就可以自定义异常处理。 回到go语言&#xff0c;在Error()方法中用*argError 这样一个指针类来充当error接口的实现类。 在f2()方法中定义返回值…