怎么提高数据匹配效率?

小小Java人 2020-08-07 10:19:34
现有一个pointmaps 的类型是LIst<Map<String,String>> 是时间点 ,
pointmaps 中每个map都有一个pdate(日期)的key 和若干个periodID(时间点id) 的key。时间点id的value为时间点名,如: 12:00,12:15等
pointmaps:[
{ "pdate": "2020-01-01"} {periodid_1:periodname_1},{periodid_2:periodname_2},.......{periodid_n:periodname_n},
{ "pdate": "2020-01-02"} {periodid_1:periodname_1},{periodid_2:periodname_2},.......{periodid_n:periodname_n}
........
]
实际上pointmaps中的每个map中都指定了一个日期,和若干个时刻点
如图:图中每个map的pdate没有显示出来,在最后面,看不到了


背景:
有两个列表List<unitPower> List<PlantPower> 其中 unitPower类和 plantPower类 都有中pdate(日期),periodID(时间点id),和power

需求:
求得pointmaps中的所有 不同日期的时刻点 的power总和 ,
此总和为上述两个列表中对应日期中对应时刻点的power和。没有该时刻点或日期就默认为0
最后结果存放到List<Powerpoint>。 Powerpoint 类有 pdate(日期),periodID(时间点id),periodName(时刻点名)和power。


分析:
1.List<Powerpoint>中元素的个数等于pointmaps中时刻点的个数。
可以将pointmaps进行遍历

for(Map map : pointmaps){ //遍历pointmaps
String pdate= pointmaps.get("pdate"); //获取map中的日期
for(Entry entry:map.Entry()){ //遍历map
int powerInUnit=0; int powerInPLant=0;
for(UnitPower unitPower: List<unitPower>){
if( unitPower.getPdate().equals(pdate)&&unitPower.getperiodID().equals(entry.getkey())){ //匹配日期和时刻点
powerInUnit=unitPower.getPower(); //获取此时刻power
break;
}
}
for(PlantPower plantPower: List<PlantPower>){
if( plantPower.getPdate().equals(pdate)&&plantPower.getperiodID().equals(entry.getkey())){ //匹配日期和时刻点
powerInPlant=plantPower.getPower(); //获取此时刻power
break;
}
}
//保存此日期,此时刻点的power。power=powerInUnit+powerInPLant
doSave();
}
}


问题:
一般来说pointmaps中有三百多个点。List<unitPower> 和List<PlantPower>这两个类分别会有一千多个点。
一个方法调用下来要循环几十万次。造成执行缓慢
而且该方法调用频率较高。导致整个程序都慢了。

各位大哥们,像我遇到的这种场景有没有更好的解决方案。
或者怎么优化它的日期,时间点的匹配。
怎么提高它的运行效率



...全文
2019 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
大隐藏于寺 2020-08-08
  • 打赏
  • 举报
回复
测试起来效果咋样?
小小Java人 2020-08-08
  • 打赏
  • 举报
回复
蛮好的,数据量比较大的时候。Hashmap取值还是蛮快的
YangjulongTrue 2020-08-07
  • 打赏
  • 举报
回复
   for(UnitPower unitPower:  List<unitPower>){
if( unitPower.getPdate().equals(pdate)&&unitPower.getperiodID().equals(entry.getkey())){ //匹配日期和时刻点
powerInUnit=unitPower.getPower(); //获取此时刻power
break;
}
}
for(PlantPower plantPower: List<PlantPower>){
if( plantPower.getPdate().equals(pdate)&&plantPower.getperiodID().equals(entry.getkey())){ //匹配日期和时刻点
powerInPlant=plantPower.getPower(); //获取此时刻power
break;
}
}

1 可以 放到 hashmap 中 拿 pdate 的key 直接获取值
2 你的时间有规律你没有发现吗 可以直接计算 不用在遍历了 1 0000 2 0015 4 01 0 0 id *15 就是秒 为什么这么麻烦 ? 搞不懂你要干什么
孤独的海啊 2020-08-07
  • 打赏
  • 举报
回复
建议 你上HashMap。
大隐藏于寺 2020-08-07
  • 打赏
  • 举报
回复

    public static void main(String[] args) {
    ArrayList<HashMap<String, String>> pointmaps = new ArrayList<>();
    ArrayList<UnitPower> unitPowers = new ArrayList<>();
    ArrayList<PlantPower> plantPowers = new ArrayList<>();
    //对List<UnitPower>使用日期和时间点分组,分组后得到的unitPowersMaps为<日期,<时间点,List<UnitPower>>>
    // 只要日期与时间点不重复,正常情况下最里层的List<UnitPower>应该只有一个元素
    Map<String, Map<String, List<UnitPower>>> unitPowersMaps = unitPowers.stream()
            .collect(Collectors.groupingBy(UnitPower::getPdate
                    , Collectors.groupingBy(UnitPower::getPeriodID)));
    ///对List<PlantPower>使用日期和时间点分组,plantPowersMaps为<日期,<时间点,List<PlantPower>>>
    Map<String, Map<String, List<PlantPower>>> plantPowersMaps = plantPowers.stream()
            .collect(Collectors.groupingBy(PlantPower::getPdate
                    , Collectors.groupingBy(PlantPower::getPeriodID)));

    pointmaps.stream().parallel().forEach(map -> {
        String date = map.get("pdate");
        //获取date日期的unitPowers
        Map<String, List<UnitPower>> periodIdAndUnitPowerMap = unitPowersMaps.get(date);
        //获取date日期的plantPowers
        Map<String, List<PlantPower>> periodIdAndPlantPowerMap = plantPowersMaps.get(date);
        for (Map.Entry<String, String> entry : map.entrySet()) {
            //时间点
            String periodId = entry.getValue();
            int powerInUnit = 0;
            int powerInPlant = 0;
            if (StringUtils.equals("pdate", entry.getKey())) {
                //如果为key为日期,跳过
                continue;
            }
            if (Objects.nonNull(periodIdAndUnitPowerMap)) {
                List<UnitPower> unitPowerList = periodIdAndUnitPowerMap.get(periodId);
                //按照分组时候的逻辑,如果日期与时间点不重复,List<UnitPower>只有一个元素,
                // 也有可能时间点不存在,也就没有元素
                if (unitPowerList.size() > 0) {
                    UnitPower unitPower = unitPowerList.get(0);
                    powerInUnit = unitPower.getPower();
                }

            }
            if (Objects.nonNull(periodIdAndPlantPowerMap)) {
                List<PlantPower> plantPowerList = periodIdAndPlantPowerMap.get(periodId);
                //按照分组时候的逻辑,如果日期与时间点不重复,List<UnitPower>只有一个元素,
                // 也有可能时间点不存在,也就没有元素
                if (plantPowerList.size() > 0) {
                    PlantPower plantPower = plantPowerList.get(0);
                    powerInPlant = plantPower.getPower();
                }
            }

            //保存此日期,此时刻点的power。power=powerInUnit+powerInPlant 
           //如果使用了mybatis或者mybatis-plus,此时可以不保存到数据库中,保存到list中,
           // 最后使用批量保存提高插入效率,如果使用的Spring  data jpa 批量保存仅仅是简单的for循环,还不如在这保存
            doSave();

        }
    });
    }
课题一高性能高扩展的千亿级实时数据仓库全实现 随着我们从IT时代步入DT时代,数据积累量也与日俱增,同时伴随着互联网的发展,越来越多的应用场景产生,传统的数据处理、存储方式已经不能满足日益增长的需求。而互联网行业相比传统行业对新生事物的接受度更高、应用场景更复杂, 因此基于大数据构建的数据仓库最先在互联网行业得到了尝试。 高性能高扩展的亿级电商全端实时数据仓库全实现(PC、移动、小程序) ,以热门的互联网电商实际业务应用场景为案例讲解,对电商数据仓库的常见实战指标以及难点实战指标进行了详尽讲解,具体指标包括:每日、月大盘收入报表、高付费用户分析报表、流量域多方位分析、营销域多方位分析、实时排行榜指标分析、用户主题分析、店铺主题时间区间分析等,数据分析涵盖全端(PC、移动、小程序)应用,与互联网企业大数据技术同步,让大家能够真正学到大数据企业级数据仓库的实战经验。 本课程凝聚讲师多年一线大数据企业实际项目经验,大数据企业在职架构师亲自授课,全程实操代码,带你体验真实的大数据开发过程,代码现场调试。通过本课程的学习再加上老师的答疑,你完全可以将本案例直接应用于企业。 课题二基于Flink+Hudi构建企业万亿级云上实时数据湖教程 随着互联网的发展,数据的不断膨胀,从刚开始的关系型数据库到非关系型数据库,再到大数据技术,技术的不断演进最终是随着数据膨胀而不断改变,最初的数据仓库能解决我们的问题,但是随着时代发展,企业已经不满足于数据仓库,希望有更强大的技术来支撑数据的存储,包括结构化,非结构化的数据等,希望能够积累企业的数据,从中挖掘出更大的价值。基于这个背景,数据湖的技术应运而生。 本课程基于真实的企业数据湖案例进行讲解,结合业务实现数据湖平台,让大家在实践中理解和掌握数据湖技术,未来数据湖的需求也会不断加大,希望同学们抓住这个机遇。 项目中将以热门的互联网电商业务场景为案例讲解,具体分析指标包含:流量分析,订单分析,用户行为分析,营销分析,广告分析等,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。 课题三基于电商业务全链路数据中台落地方案(全渠道、全环节、全流程) 在互联网发展浪潮中,数据对于企业的价值是非常大的,怎么管理好数据,以及快速挖掘数据价值,共享数据价值,急需一套解决方案,在数据开发中,核心数据模型的变化是相对缓慢的,同时,对数据进行维护的工作量也非常大;但业务创新的速度、对数据提出的需求的变化,是非常快速的。数据中台的出现,就是为了弥补数据开发和应用开发之间,由于开发速度不匹配,出现的响应力跟不上的问题。数据中台解决的问题,包括:效率问题、协作问题、能力问题,数据中台是聚合和治理跨域数据,将数据抽象封装成服务,提供给前台以业务价值的逻辑概念。 本课程基于真实企业数据中台建设架构进行讲解,带大家构建数据中台,通过学习完本课程可以节省你摸索的时间,节省企业成本,提高企业开发效率。 课程包含几大模块:数据源管理、数据接入管理、数据质量管理、数据质量报告、数据安全管理、数据查询IDE、数据血缘以及元数据管理、数据中台实战应用等,对于数据中台涉及到的业务以及技术进行详尽的讲解。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧