如何用java实现数据库inner join算法,将不同list中的map关联到一行上

不恋水的雨 2019-11-05 05:54:13
场景:有三个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循环一个个处理,速度非常慢,所以需要一种更优的计算方法
...全文
1136 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2019-11-06
  • 打赏
  • 举报
回复
用list的filter试试吧(其实原理还是for)
现根据关联关系把符合条件的list1选出来,然后再遍历选出的list1把符合条件list2和list3加进选出的结果集
for example

public 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();
}
}
}
oh_Maxy 2019-11-05
  • 打赏
  • 举报
回复
这个可以将list1到list3看做3个表的记录。
还是要写方法循环比对的。
要循环list1里的map,复杂度为O(n*m)。

62,614

社区成员

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

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