需求

一个对象list,每个对象中包含开始时间、结束时间、等级三个属性,现在要求判断list中每条数据之间是否存在交集的现象,如果存在,就按照两条数据之间的差集、交集的关系,生成一个新的list。需求如图所示:

如图,list中原本只有红色的1、2、3三条数据,现在要求分隔为蓝色的1、2、3、4、5五条数据,并且交集部分,每条数据等级取最大值。

思路

第一条数据:d1、第二条数据:d2

1、对list按照开始时间和结束时间两个属性正序排序。

2、对整个list的数据两两对比,判断d2的开始时间是否大于d1的开始时间并且小于d1的结束时间,如果是,则存在交集,对两条数据进行分隔,形成新的数据结果。

3、分隔方法:d1的开始时间 ~ d2的开始时间 | d2的开始时间 ~ d1的结束时间>d2的结束时间?d2结束时间:d1结束时间 | d2结束时间 ~ d1结束时间。

代码实现

1、准备list数据,开始时间和结束时间都是用的时间戳格式,方便对比

"stime","etime","level"
"1641553083000","1641567483000","1"
"1641755759000","1641770799000","1"
"1641844800000","1641859812000","1"
"1641930857000","1641948197000","1"
"1642016936000","1642034126000","1"
"1642101897000","1642122000000","1"
"1642132800000","1642159162000","2"
"1642194000000","1642251235000","2"
"1642276800000","1642292972000","2"
"1642305798000","1642338172000","2"
"1642366800000","1642383279000","2"
"1642385743000","1642410887000","2"
"1642449600000","1642514400000","2"
"1642532418000","1642597200000","1"
"1642532958000","1642588274000","2"
"1642560737000","1642588274000","3"
"1642622400000","1642647600000","1"
"1642622781000","1642647600000","2"
"1642651200000","1642663086000","2"
"1642663888000","1642679318000","3"
"1642706412000","1642756183000","2"
"1642798800000","1642814491000","3"
"1642817635000","1642847093000","3"
"1642881600000","1642924800000","3"
"1642932000000","1642933499000","3"
"1642971600000","1643030605000","3"
"1643053962000","1643103522000","3"
"1643108209000","1643122800000","3"
"1643140800000","1643157743000","3"
"1643227338000","1643270400000","3"
"1643320800000","1643353200000","3"

2、java实现

package com.test;import com.alibaba.fastjson.JSON;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Test {public static void main(String[] args) {List<Map<String,Object>> list = new ArrayList<>();/*** 给list添加数据*/List<Map<String,Object>> newList = check(list);newList.stream().forEach(e -> {System.out.println(JSON.toJSONString(e));});}public static List<Map<String, Object>> check(List<Map<String, Object>> intervalList) {List<Map<String, Object>> interval = new ArrayList<>();interval.add(intervalList.get(0));for (int i = 0; i < intervalList.size(); i++) {Boolean flag = true;Map<String, Object> m2 = intervalList.get(i);for (int j =0;j<interval.size();j++){Map<String, Object> m1 = interval.get(j);Long m1stime = new BigDecimal(String.valueOf(m1.get("stime"))).longValue();Long m1etime = new BigDecimal(String.valueOf(m1.get("etime"))).longValue();Long m1level = new BigDecimal(String.valueOf(m1.get("level"))).longValue();Long m2stime = new BigDecimal(String.valueOf(m2.get("stime"))).longValue();Long m2etime = new BigDecimal(String.valueOf(m2.get("etime"))).longValue();// 存在交集if (m2stime >= m1stime && m2stime < m1etime) {flag = false;interval.remove(j);//第一个差集if (m2stime>m1stime){Map<String,Object> m_ = new HashMap<>();m_.put("stime",m1stime);m_.put("etime",m2stime);m_.put("level",m1level);interval.add(m_);}//第一个交集if (m2etime>=m1etime){Map<String,Object> m_ = m2;interval.add(m_);} else {Map<String,Object> m_1 = m2;Map<String,Object> m_2 = new HashMap<>();m_2.put("stime",m2etime);m_2.put("etime",m1etime);m_2.put("level",m1level);interval.add(m_1);interval.add(m_2);}}}if (flag) {interval.add(m2);}}return interval;}
}

关注我的公众号,学习更多知识。

对list取交集,生成新的list相关推荐

  1. 【Pandas】对比两列取最大值生成新的一列

    [Pandas]对比两列取最大值生成新的一列 问题: 假设 dataframe 中有如下两列,如何生成第三列 best,其值取scheme1与scheme2 对应的最大值 解决方法: df['best ...

  2. vba 跳到下一个循环_VBA野知识分享:从一个数组中取部分值生成新数组,不使用循环的思路...

    从一个数组中取部分值生成新数组,要实现此需求通常都是采用循环的方法来完成,那有没有更简易的思路呢? 借用jscript可以实现,直接取值,不用循环.例如从100000万中元素是取8000个值出来生成新 ...

  3. python 根据判断产生新列_pandas DataFrame 根据多列的值做判断,生成新的列值实例...

    环境:Python3.6.4 + pandas 0.22 主要是DataFrame.apply函数的应用,如果设置axis参数为1则每次函数每次会取出DataFrame的一行来做处理,如果axis为1 ...

  4. 【运筹学】线性规划数学模型 ( 单纯形法 | 第二次迭代 | 方程组同解变换 | 生成新单纯形表 | 计算检验数 | 最优解判定 | 线性规划解个数分析 )

    文章目录 一.第二次迭代 二.方程组同解变换 三.生成新的单纯形表 四.计算检验数.最优解判定 五.最优解个数说明 1.唯一最优解 2.无穷最优解 3.无界解 4.总结 六.出基变量选择说明 上一篇博 ...

  5. java爬取论坛信息_Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

  6. 【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)

    背景需求: [办公类-22-01]周计划系列(1)-生成"信息窗"(提取旧docx内容,写入EXCLE模板,再次生成新docx) 前一篇介绍了生成"信息窗"的过 ...

  7. 机械臂论文笔记(一)【基于卷积神经网络的二指机械手 抓取姿态生成研究 】

    基于卷积神经网络的二指机械手 抓取姿态生成研究 论文下载 摘要 第1章 绪论 1.1 抓取生成国内外研究现状 1.1.1已知物体抓取生成 1.1.2相似物体抓取生成 1.1.3 未知物体抓取生成 1. ...

  8. 爬取网站生成字典的常用工具:cewl

    密码攻击工具其实也就是密码字典生成工具,前面介绍过几个字典生成工具,都是需要结合一些社会工程学的信息收集,且针对的都是用户账号. 这里介绍的工具(cewl)主要是针对网站的. cewl简介 cewl是 ...

  9. (python爬虫)新浪新闻数据爬取与清洗+新浪新闻数据管理系统+MySQL

    新浪新闻数据爬取与清洗+新浪新闻数据管理系统 设计要求 新浪新闻数据爬取与清洗 基本要求:完成新浪新闻排行中文章的数据爬取,包括标题.媒体.时间.内容. 进阶要求:对最近一周出现次数最多的关键字排名并 ...

  10. C# 对ListT取交集、连集及差集

    實際演練 ※本文使用int為例,若為使用自訂之DataModel,需實作IEquatable<T>介面才能使用 1.  取交集 (A和B都有) List A : { 1 , 2 , 3 , ...

最新文章

  1. muduo之Socket和SocketsOps
  2. 数据集 | 计算机视觉开源数据集(计算机视觉图像、定位、识别)
  3. NGUI-Tweens
  4. Java RESTful API集成测试
  5. python asyncio tcp server_asyncio异步IO——Streams详解
  6. 利用汇编与机器码定位崩溃点
  7. Android手机截屏
  8. 关于Git GUI的使用方式
  9. WinForm AutoComplete 输入提示、自动补全
  10. Android TV开发总结(七)构建一个TV app中的剧集列表控件
  11. Scrapy爬取当当网畅销图书保存csv格式!最详细的教程!
  12. Ubuntu20.04系统联网
  13. 利用Arthas进行简单的故障注入
  14. jQWidgets v8.0.0正式发布
  15. 3.提取线稿(PS)
  16. 后端程序员福音 -- TellMe 推送助手
  17. 【计算机图形学实验四——简单几何形体的平移、缩放、旋转等几何变换】
  18. 科大讯飞语音离线命令识别
  19. knn可视化、稠密dsift原理、手势识别
  20. SEO的初学者教学,搞懂SEO搜寻引擎优化,让你网站订单接不完

热门文章

  1. 小米嵌入式面经(转发)
  2. js生成二维码,并将生成的二维码进行保存(手动下载)
  3. 如何用C++写一个军旗耍耍
  4. php和PHPnow冲突了,安装使用PHPnow后程序无法使用有关问题
  5. Python虚拟环境venv的日常使用
  6. tf.shape和tf.less
  7. 前端笔记—从入门到坟墓[HTML][知识准备][1]
  8. python提效小工具-统计xmind用例数量
  9. 中南大学推免面试英文自我介绍
  10. 【小梅哥FPGA进阶教程】第十一章 四通道幅频相可调DDS信号发生器