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.pswp.cn/diannao/40602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40602.shtml
英文地址,請注明出處:http://en.pswp.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;又是怎么…