栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

对list取交集,生成新的list

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

对list取交集,生成新的list

需求

一个对象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> list = new ArrayList<>();

        

        List> newList = check(list);
        newList.stream().forEach(e -> {
            System.out.println(JSON.toJSONString(e));
        });
    }

    public static List> check(List> intervalList) {
        List> interval = new ArrayList<>();
        interval.add(intervalList.get(0));
        for (int i = 0; i < intervalList.size(); i++) {
            Boolean flag = true;
            Map m2 = intervalList.get(i);
            for (int j =0;j
                Map 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 m_ = new HashMap<>();
                        m_.put("stime",m1stime);
                        m_.put("etime",m2stime);
                        m_.put("level",m1level);
                        interval.add(m_);
                    }
                    //第一个交集
                    if (m2etime>=m1etime){
                        Map m_ = m2;
                        interval.add(m_);
                    } else {
                        Map m_1 = m2;
                        Map 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;
    }
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/839272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号