资讯专栏INFORMATION COLUMN

HashMap 分拣存储 实现一对多映射

venmos / 1939人阅读

摘要:实际需求中如何运用实现过滤重复这里的重复不一定是某个字段一样的,而且时间点不重叠这里需要校验不重叠的字段有员工所在部门,出发点,目的点,生效日期,失效日期,出发时点,到达时点,出发分钟,到达分钟是需要校验的对象。

在我们的印象中,Map k,v 映射,一对一的比较多,下面主要讲一对多的关系映射,主要需求在于,需要把很多的,杂乱的数据 按照不同的类型进行分类处理,A,B,C类型的数据进行分类统计
比如,计算字母/单词出现的次数
String str = "t/h/is/is/a/car/a/n/d/t/ha/t/is/tr/uck/a/nd/w/h/e/r/e/is/t/he/s/t/uffs";

String [] str =
              "t/h/is/is/a/car/a/n/d/t/ha/t/is/tr/uck/a/nd/w/h/e/r/e/is/t/he/s/t/uffs".split("/");
      Map map 
              = new HashMap();
      for(String key:str){
          //方法1
          //检查map里面是否存在这个单词,如果不存在 说明之出现一次
//          if(!map.containsKey(key)){
//              map.put(key, 1);
//          }else{
//              map.put(key, map.get(key)+1);//存在 就在前面的基础上面+1 计算出现的次数
//          }
          //方法2
          Integer value = map.get(key);
          if(value == null){
              map.put(key, 1);
          }else{
              map.put(key, value+1);
          }
      }
      Set keySet = map.keySet();
      Iteratorit = keySet.iterator();
      while(it.hasNext()){
          String key = it.next();
          Integer value = map.get(key);
          System.out.println(key+"-->"+value);
      }
    }

当然,这里的value也可以是对象,对于不同的场景 进行灵活的应用。

实际需求中如何运用HashMap实现过滤重复
这里的重复不一定是某个字段一样的,而且时间点不重叠 这里需要校验不重叠的字段 有 "员工所在部门","出发点","目的点","生效日期","失效日期","出发时点","到达时点","出发分钟","到达分钟"

entity 是需要校验的对象。

   final Map> trfsVo = new HashMap> ();
   //判断是否重复
            if (entity.getDeptCode()!=null && entity.getBeginDeptCode() != null &&
                entity.getEndDeptCode()!=null && entity.getEffectiveDate() != null && entity.getInvalidDate() != null ) {
                //三个点重复就继续判断时间点是否重叠
                String key = StringUtil.append(entity.getDeptCode(),"_",entity.getBeginDeptCode(),"_",entity.getEndDeptCode());
                if (trfsVo.containsKey(key)) {
                    List vo = trfsVo.get(key);
                    Calendar now = Calendar.getInstance();
                    now.set(Calendar.HOUR_OF_DAY, entity.getBeginTimePoint());
                    now.set(Calendar.MINUTE, entity.getBeginTimeMinute());
                    long entity_start = now.getTime().getTime();
                    now.set(Calendar.HOUR_OF_DAY, entity.getEndTimePoint());
                    now.set(Calendar.MINUTE, entity.getEndTimeMinute());
                    long entity_end = now.getTime().getTime();
                    for(TransferNumUnitPrice vor:vo) {
                        
                        //entity代表原来excel里面的数据,vor 从excel里面过滤处理出来有3个code重复的数据
                        if (    //过滤生效日期在区间范围重叠
                                ((
                                (vor.getEffectiveDate().compareTo(entity.getEffectiveDate())!=1)
                                &&
                                (vor.getInvalidDate().compareTo(entity.getEffectiveDate())!=-1)
                                )
                                ||
                                //过滤失效日期在区间范围重叠
                                (
                                (vor.getEffectiveDate().compareTo(entity.getInvalidDate())!=1)
                                &&
                                (vor.getInvalidDate().compareTo(entity.getInvalidDate())!=-1)
                                )
                                ||
                                //过滤包含重叠
                                (
                                (vor.getEffectiveDate().compareTo(entity.getEffectiveDate())==1)
                                &&
                                (vor.getInvalidDate().compareTo(entity.getInvalidDate())==-1)
                                ))
                        ) {
                            now.set(Calendar.HOUR_OF_DAY, vor.getBeginTimePoint());
                            now.set(Calendar.MINUTE, vor.getBeginTimeMinute());
                            long vorhm_start = now.getTime().getTime();
                            now.set(Calendar.HOUR_OF_DAY, vor.getEndTimePoint());
                            now.set(Calendar.MINUTE, vor.getEndTimeMinute());
                            long vorhm_end = now.getTime().getTime();
                            if (  //开始时间在区间范围中
                                    (vorhm_start <= entity_start
                                    &&
                                    vorhm_end >= entity_start)
                                    ||
                                  //结束时间在区间范围中
                                    (vorhm_start <= entity_end
                                    &&
                                    vorhm_end >= entity_end)
                                    ||
                                  // 时间包含 
                                    (vorhm_start > entity_start
                                    &&
                                    vorhm_end < entity_end)
                                    ) {
                                //加入异常 比较异常
                                vo.add(entity);
                                throw new NovatarRuntimeException(getMessageSource().getMessage("transferNumUnitPrice.excelDataConflict"));
                            }
                        }
                    }
                    //加入需要比较的无异常的数据 进行比较
                    vo.add(entity);
                } else {
                    List vo = new LinkedList();
                    vo.add(entity);
                    trfsVo.put(key, vo);
                }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64832.html

相关文章

  • 面试官都会问的Mybatis面试题,你会这样回答吗?

    摘要:最终能和面试官聊的开心愉快投缘的叫面霸。能够与很好的集成提供映射标签,支持对象与数据库的字段关系映射提供对象关系映射标签,支持对象关系组件维护。使用可以有效的防止注入,提高系统安全性。 showImg(https://segmentfault.com/img/bVbsSlt?w=358&h=269); 一、概述 面试,难还是不难?取决于面试者的底蕴(气场+技能)、心态和认知及沟通技巧。...

    seanHai 评论0 收藏0
  • 通过项目逐步深入了解Mybatis(四)

    摘要:相关阅读通过项目逐步深入了解一通过项目逐步深入了解二通过项目逐步深入了解三本项目所有代码及文档都托管在地址延迟加载什么是延迟加载可以实现高级映射使用实现一对一及一对多映射,具备延迟加载功能。一级缓存是级别的缓存。 相关阅读: 1、通过项目逐步深入了解Mybatis 2、通过项目逐步深入了解Mybatis 3、通过项目逐步深入了解Mybatis 本项目所有代码及文档都托管在 Github...

    kuangcaibao 评论0 收藏0
  • map集合的学习

    摘要:提供了专门的集合类用来存放这种对象关系的对象,即接口。中的集合,元素是成对存在的理解为夫妻。中的集合称为单列集合,中的集合称为双列集合。根据指定的键,在集合中获取对应的值。 day04 【Map】 主要内容 Map集合 教学目标 [ ] 能够说出Map集合特点 [ ] 使用Map集合添加方法保存数据 [ ] 使用键找值的方式遍历Map集合 [ ] 使用键值对的方式遍历Map集合 [ ...

    peixn 评论0 收藏0
  • Java 性能调优指南之 Java 集合概览

    摘要:单线程集合本部分将重点介绍非线程安全集合。非线程安全集合框架的最新成员是自起推出的。这是标准的单线程阵营中唯一的有序集合。该功能能有效防止运行时造型。检查个集合之间不存在共同的元素。基于自然排序或找出集合中的最大或最小元素。 【编者按】本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型。文章系国内 ITOM 管理平台 O...

    gnehc 评论0 收藏0

发表评论

0条评论

venmos

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<