java实现innerjoin关联算法

场景:有三个List<Map>变量,分别为list1、list2、list3

List<Map<String,Object>> list1 = new ArrayList<>();
List<Map<String,Object>> list2 = new ArrayList<>();
List<Map<String,Object>> list3 = new ArrayList<>();

现在需要根据一个输入的字符"list1.column1=list2.column2,list1.column3=list3.column4"(不是固定的)来实现inner join关系的控制,即list1中的map和list2中map通过key值column1和column2关联,同时list1中的map和list3中map通过key值column3和column4关联。在sql中就是"select * from list1 inner join list2 on list1.column1=list2.column2 inner join list3 on list1.column3=list3.column4",将不同list中的map关联到一行上:

    private static void test(){
        long t0 = System.currentTimeMillis();
        List<Map<String,Object>> list1 = new ArrayList<>();
        List<Map<String,Object>> list2 = new ArrayList<>();
        List<Map<String,Object>> list3 = new ArrayList<>();
        //构造10万条数据
        for (int i = 0; i < 100000; i++) {
            String uuid = UUID.randomUUID().toString();

            Map<String,Object> m1 = new HashMap<>();
            m1.put("id1",i);
            m1.put("value1", uuid.charAt(10)+uuid.charAt(12));

            Map<String,Object> m2 = new HashMap<>();
            m2.put("id2",i);
            m2.put("value2", uuid.charAt(10)+uuid.charAt(1));

            Map<String,Object> m3 = new HashMap<>();
            m3.put("id3",i);
            m3.put("value3", uuid.charAt(10)+uuid.charAt(12));

            list1.add(m1);
            list2.add(m2);
            list3.add(m3);
        }
        long t1 = System.currentTimeMillis();
        System.out.println("构造数据耗时:"+(t1-t0));
        //添加关联条件
        ArrayList<JoinRelation> joinRelations = new ArrayList<>();
        joinRelations.add(new JoinRelation("list1.id1=list2.id2"));
        joinRelations.add(new JoinRelation("list1.value1=list2.value2"));
        joinRelations.add(new JoinRelation("list2.id2=list3.id3"));
        joinRelations.add(new JoinRelation("list2.value2=list3.value3"));

        InnerJoiner<Map<String,Object>> joiner = new InnerJoiner<>(joinRelations);
        //字段逻辑
        joiner.setGetter((o, columnName) -> MapUtils.getString(o,columnName,""));

        long t11 = System.currentTimeMillis();
        System.out.println("构造join对象耗时:"+(t11-t1));

        //添加数据集
        joiner.addUnit("list1",list1)
                .addUnit("list2",list2)
                .addUnit("list3",list3);
        //进行关联操作
        joiner.join();

        DataKey key = new DataKey("list1");
        //通过key拿到关联结果集,每个结果集数据条数一样
        DataUnit<Map<String, Object>> result = joiner.getResult(key);
        System.out.println("关联条数:"+result.size());

        long t2 = System.currentTimeMillis();
        System.out.println("关联耗时:"+(t2-t11));
        //遍历其中一个数据集
        for (Map<String, Object> map : result) {
            //找到与该行关联的数据集,如果关联到多条,只会返回第一条
            Map<DataKey, Map<String, Object>> row = joiner.findRow(map, key);
            int i = 0;
        }
        long t3 = System.currentTimeMillis();
        System.out.println("单行遍历查找耗时:"+(t3-t2));
    }

测试效果: 

总共10万条数据,通过关联条件得到6千条数据,遍历每一行拿到与之关联的数据总共耗时38秒,平均每次关联耗时6毫秒,后面有空会进行优化

 源码链接:https://download.csdn.net/download/qq_36635569/87770897

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值