现在需求是: 有两个
List<Map<String,Object>> list1
List<Map<String,Object>> list2
list1 中的数据会很多; 例如: list1 有100条
list2 中的数据肯定不会比list1多; 例如: list2 有10条
这两条没有上下对应的关系 list1数据和list2顺序也不一样。
暂且把这两个list想象成记录的是用户信息的数据吧
其中list1中的100条数据和list2中的10条数据是一样的 这是期望的结果
但是 偶尔会出现list2中的10条中 其中一条对应不上list1中的100条其中的一条(有时候可能有多条对应不上) 比如 list2中的 王五的acctNo 不等于list1中的 王五acctNo 然后把这条数据给找出来!也就是把这个map找出来(有时候可能有多条,多个map可以返回List<Map>) 这就是需求。
需求变了··· 领导说name也可能不一样! 我特么醉了··· 现在的情况就会是 name不一样, acctNo不一样,phone不一样,date不一样, 我的想法是 两个list先比较name 如果不一样那就存一条, acctNo不一样存一条,phone不一样存一条 date不一样存一条 (这些不相等的数据如果有多条那就是List<Map>), 这个也符合需求 最终商量就是这么干, 这种情况怎么写呀??? 求指点!
给出测试数据:
分割线===================================
新的测试数据 更新于 2020-06-25 22:15
List<String> paramName = Arrays.asList("ORDERNO", "OSORDERID", "AMT", "TRANDATE");
DataSelector.Result result = DataSelector.init(paramName)
.addMain(list1())
.addSub(list2())
.select();
System.out.println(JSON.toJSONString(result));
public static List<Map<String,Object>> list1(){
List<Map<String,Object>> list1=new ArrayList<>();
Map<String,Object> mapA1=new HashMap();
mapA1.put("ORDERNO","o20200611001");
mapA1.put("OSORDERID","os20200611001");
mapA1.put("AMT","1000");
mapA1.put("TRANDATE","20200610");
mapA1.put("TRXSERNO","seq20200611001");
list1.add(mapA1);
Map<String,Object> mapA2=new HashMap();
mapA2.put("ORDERNO","o20200611002");
mapA2.put("OSORDERID","os20200611002");
mapA2.put("AMT","2000");
mapA2.put("TRANDATE","shanxi");
mapA2.put("PDATE","Thu Jun 11 00:00:00 CST 2020");
list1.add(mapA2);
Map<String,Object> mapA3=new HashMap();
mapA3.put("ORDERNO","o20200611003");
mapA3.put("OSORDERID","os20200611003");
mapA3.put("AMT","3000");
mapA3.put("TRANDATE","20200610");
mapA3.put("TRXSERNO","seq20200611003");
list1.add(mapA3);
Map<String,Object> mapA4=new HashMap();
mapA4.put("ORDERNO","o20200611001_01");
mapA4.put("OSORDERID","os20200611001_01");
mapA4.put("AMT","1200");
mapA4.put("TRXSERNO","seq20200611001_01");
list1.add(mapA4);
Map<String,Object> mapA5=new HashMap();
mapA5.put("ORDERNO","o20200611001_03");
mapA5.put("OSORDERID","os20200611001_03");
mapA5.put("AMT","3100");
mapA5.put("TRANDATE","20200610");
mapA5.put("TRXSERNO","seq20200611001_03");
list1.add(mapA5);
return list1;
}
public static List<Map<String,Object>> list2(){
List<Map<String,Object>> list2=new ArrayList<>();
Map<String,Object> mapB3=new HashMap();
mapB3.put("ORDERNO","o20200611001");
mapB3.put("OSORDERID","os20200611001");
mapB3.put("AMT","1000");
mapB3.put("TRANDATE","20200610");
mapB3.put("ACCOUNT_NO","DCCX000000001");
list2.add(mapB3);
Map<String,Object> mapB2=new HashMap();
mapB2.put("ORDERNO","o20200611002");
mapB2.put("OSORDERID","os20200611002");
mapB2.put("AMT","1000");
mapB2.put("TRANDATE","shanxi");
mapB2.put("ACCOUNT_NO","DCCX003");
list2.add(mapB2);
return list2;
}
两种方案执行结果如下:
方案1结果:
{
"diffList":[
],
"sameList":[
{
"ORDERNO":"o20200611001",
"AMT":"1000",
"ACCOUNT_NO":"DCCX000000001",
"OSORDERID":"os20200611001",
"TRANDATE":"20200610"
},
{
"ORDERNO":"o20200611002",
"AMT":"1000",
"ACCOUNT_NO":"DCCX003",
"OSORDERID":"os20200611002",
"TRANDATE":"shanxi"
}]
}
方案2执行结果
{
"diffList":[
],
"sameList":[
{
"ORDERNO":"o20200611001",
"AMT":"1000",
"ACCOUNT_NO":"DCCX000000001",
"OSORDERID":"os20200611001",
"TRANDATE":"20200610"
},
{
"ORDERNO":"o20200611002",
"AMT":"1000",
"ACCOUNT_NO":"DCCX003",
"OSORDERID":"os20200611002",
"TRANDATE":"shanxi"
}]
}
我期望的结果为:
{
"diffList":[
{
"data":{
"ORDERNO":"o20200611002",
"AMT":"1000",
"ACCOUNT_NO":"DCCX003",
"OSORDERID":"os20200611002",
"TRANDATE":"shanxi"
},
"paramNames":[
"AMT"
]
}
],
"sameList":[
{
"ORDERNO":"o20200611001",
"AMT":"1000",
"ACCOUNT_NO":"DCCX000000001",
"OSORDERID":"os20200611001",
"TRANDATE":"20200610"
}
]
}
究极无敌最终版!!!
方案1版本代码(mapB2在diff中返回两次):
方案2版本代码(mapB2返回一次):
究极最终版!!
我怕需求不清,所以还是建议题主试试我的代码
写的有点冲忙,没有注释哈,不过意思上基本按照你评论里的需求来做的,也许有些地方有些小问题,你可以先把上面这两个类
DataSelector
和SelectCollectorImpl
复制过去,然后这样去调用这个最终返回的
DataSelector.Result
里包含了你需要的两个list
,共同的和不同的,你可以自己点进去查看类信息。然后
init
方法里会初始化此次处理的所有字段,你就把你需要所有字段放进去,记住是所有的addMain
里参数加的是你那100
条数据,也就是作为依据匹配的list1
addSub
当然加的参数是你那10
条数据,也就是list2
然后执行试试吧,我简单试了你之前给的两个字段的例子,应该是可以的,下面最后打印出来的
result
结果,为了方便看我给你转成了json
格式的仅供参考~
华丽的分割线
更新第三种,根据某个字段去过滤,那这里肯定要写出一个方法了,参数也就是三个,两个
List
,和最后需要过滤的字段filterParam
那你想过滤什么字段就过滤什么字段呗,这里面有个
NAME
是全局的(
private static final String NAME = "name";
)华丽的分割线
第二波更新
了解了一下需求,若只是把
name
相同而acctNo
不同的找出来可以去验证一下
华丽的分割线
我感觉题主你没有把问题说清楚把,因为从你的描述来看,我感觉你两个
List<Map>
看似分开,但是实际描述中觉得是对应的,也就是两个List
中的每一个map
按照List
的顺序是对应,你说你只想找出那我可不可以认为你给出的两个List是上下对应的,那我觉得就简单了。。。直接一个循环就出来了
最后我是找出了

acctNo
,但是其实题主你这里有点小问题,还有个李四的acctNo
也不一样哈,你仔细看当然最后我不知道你到底想要返回什么。。。如果你能把问题描述清楚
可能回答的人会更多
你在评论提到你希望用
lambda
,那你都不明确你希望最终获取什儿样的结果格式,别人怎么用lambda
帮你想,比如你说那几个中文字到底对应
java
的什么返回类型嘛,你说清楚点可能更好点吧