场景:有三个List<Map>变量,现在需要根据一个输入的字符"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关联到一行上,请问要如何实现?
如果使用简单的for循环一个个处理,速度非常慢,所以需要一种更优的计算方法

解决方案 »

  1.   

    这个可以将list1到list3看做3个表的记录。
    还是要写方法循环比对的。
    要循环list1里的map,复杂度为O(n*m)。
      

  2.   

    用list的filter试试吧(其实原理还是for)
    现根据关联关系把符合条件的list1选出来,然后再遍历选出的list1把符合条件list2和list3加进选出的结果集
    for examplepublic class Sample {
        public static void main(String[] args) {
            try {
                List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>() {{ //假设各个list的数据
                    add(new HashMap<String, Object>() {{
                        put("column11", 1);
                        put("column12", 2);
                        put("column13", 3);
                    }});
                    add(new HashMap<String, Object>() {{
                        put("column11", 1);
                        put("column12", 12);
                        put("column13", 13);
                    }});
                    add(new HashMap<String, Object>() {{
                        put("column11", 21);
                        put("column12", 22);
                        put("column13", 23);
                    }});
                }};
                List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>() {{
                    add(new HashMap<String, Object>() {{
                        put("column21", 1);
                        put("column22", 2);
                        put("column23", 3);
                    }});
                    add(new HashMap<String, Object>() {{
                        put("column21", 11);
                        put("column22", 1);
                        put("column23", 13);
                    }});
                    add(new HashMap<String, Object>() {{
                        put("column21", 21);
                        put("column22", 22);
                        put("column23", 23);
                    }});
                }};
                List<Map<String, Object>> list3 = new ArrayList<Map<String, Object>>() {{
                    add(new HashMap<String, Object>() {{
                        put("column31", 1);
                        put("column32", 2);
                        put("column34", 33);
                    }});
                    add(new HashMap<String, Object>() {{
                        put("column31", 11);
                        put("column32", 12);
                        put("column34", 33);
                    }});
                    add(new HashMap<String, Object>() {{
                        put("column31", 21);
                        put("column32", 22);
                        put("column34", 3);
                    }});
                }};
                //选出符合条件的list1
                List<Map<String, Object>> result = list1.stream()
                        .filter( //是否存在list2的column2==list1.column1
                            m->
                            list2.stream()
                                .filter(
                                    mm->mm.get("column22").equals(m.get("column11"))
                                )
                                .findAny()
                                .isPresent()      
                        )
                        .filter(//是否存在list3的column4==list1.column3
                                m->
                                list3.stream()
                                    .filter(
                                        mm->mm.get("column34").equals(m.get("column13"))
                                    )
                                    .findAny()
                                    .isPresent()
                        )
                        .collect(Collectors.toList());
                //在选出符合条件的list1的基础上,把符合条件的list2,list3加入结果集
                result.forEach(m->{
                    Map<String, Object> obj = list2.stream().filter(mm->mm.get("column22").equals(m.get("column11"))).findFirst().get();
                    for (Map.Entry<String, Object> o : obj.entrySet()) {
                        m.put(o.getKey(), o.getValue());
                    }
                    obj = list3.stream().filter(mm->mm.get("column34").equals(m.get("column13"))).findFirst().get();
                    for (Map.Entry<String, Object> o : obj.entrySet()) {
                        m.put(o.getKey(), o.getValue());
                    }
                });
                //打印结果
                result.forEach(m->System.out.printf("%s\n", m));
                
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }