如何在java中组合两个不同的映射?
我关注了很多这样的链接,但还不能解决这个问题 我有两个映射如何在java中组合两个不同的映射?,java,java-8,Java,Java 8,我关注了很多这样的链接,但还不能解决这个问题 我有两个映射List-此映射包含acc\u num、parent\u acc\u num、crte\u dt、rnwl\u dt、userid等,而其他映射包含acc\u num和isActive(这是对第一个映射的进一步细化) 我想创建/组合这两个映射,并创建最终的映射,它包含acc\u num、parent\u acc\u num、crte\u dt、rnwl\u dt、userid+isActive详细信息 我该怎么做 下面是示例数据。唯一的问
List
-此映射包含acc\u num、parent\u acc\u num、crte\u dt、rnwl\u dt、userid
等,而其他映射包含acc\u num
和isActive
(这是对第一个映射的进一步细化)
我想创建/组合这两个映射,并创建最终的映射,它包含acc\u num、parent\u acc\u num、crte\u dt、rnwl\u dt、userid
+isActive
详细信息
我该怎么做
下面是示例数据。唯一的问题是两者都是映射列表,如何迭代
{CRTE_DT=2017-06-22, USER_ID=ABC, ACC_NUM=9449, RNWL_DT=2017-06-22, PARENT_ACC_NO=9449}
{ACC_NUM=9449, IS_ACTIVE=false}
另一个问题:
如果以下工作正常,则可能不需要进行计算
我有下面使用12c的Oracle查询,如果
我会创建一个
地图
来帮助解决问题<代码>“acct_num”是两个地图共用的键,因此您将使用它来匹配它们。步骤:
- 迭代第一个列表,使用其acc_num作为键将每个元素添加到映射中
- 迭代第二个列表,使用每个元素的acct_num值在映射中查找匹配的元素,然后将第二个列表中的
对添加到刚在映射中找到的值“is_active”
- 从助手映射中获取
,您就有了一个合并了值的映射列表values()
a = [CRTE_DT:"2017-06-22", USER_ID:"ABC", ACC_NUM:9449, RNWL_DT:"2017-06-22", PARENT_ACC_NO:9449]
b = [ACC_NUM:9449, IS_ACTIVE:false]
list1 = [a]
list2 = [b]
c = new HashMap<Integer,Map<String,Object>>()
for ( Map<String,Object> r : list1 ) {
c.put(r.get("ACC_NUM"),r)
}
for (Map<String,Object> r : list2 ) {
d = c.get(r.get("ACC_NUM"));
if (d != null) d.putAll(r);
}
groovy:000> c
===> {9449={CRTE_DT=2017-06-22, USER_ID=ABC, ACC_NUM=9449, RNWL_DT=2017-06-22, PARENT_ACC_NO=9449, IS_ACTIVE=false}}
a=[CRTE-DT:“2017-06-22”,用户ID:“ABC”,账号:9449,RNWL-DT:“2017-06-22”,家长账号:9449]
b=[附件编号:9449,是否激活:错误]
列表1=[a]
列表2=[b]
c=新的HashMap()
对于(映射r:list1){
c、 put(r.get(“ACC_NUM”),r)
}
对于(映射r:list2){
d=c.get(r.get(“ACC_NUM”);
如果(d!=null)d.putAll(r);
}
groovy:000>c
==>{9449={CRTE_DT=2017-06-22,用户ID=ABC,ACC_NUM=9449,RNWL_DT=2017-06-22,家长_ACC_NO=9449,处于活动状态=false}
假设您的列表只包含两个映射,并且它们都是可变的。如果且仅当第二个映射的映射ACC_NUM
与第一个映射相等时,您可以将第二个映射的所有映射添加到第一个映射
final List<Map<String, Object>> maps = ...;
if (Optional.ofNullable(map.get(1).get("ACC_NUM")).filter(acc_num -> acc_num.equals(map.get(0).get("ACC_NUM"))).isPresent())
{
map.get(0).putAll(map.get(1));
}
最终列表映射=。。。;
if(可选)of nullable(map.get(1).get(“ACC_NUM”)).filter(ACC_NUM->ACC_NUM.equals(map.get(0).get(“ACC_NUM”)).isPresent())
{
map.get(0).putAll(map.get(1));
}
编辑
final List<Map<String, Object>> l1 = ...;
final List<Map<String, Object>> l2 = ...;
final List<Map<String, Object>> result = l1.stream()
.map(map ->
{
final Map<String, Object> r = new HashMap<>(map);
l2.stream()
.filter(map2 -> Objects.equals(map.get("ACC_NUM"), map2.get("ACC_NUM")))
.findFirst()
.map(map2 -> map2.get("IS_ACTIVE"))
.ifPresent(is_active -> map.put("IS_ACTIVE", is_active));
return r;
})
.collect(Collectors.toList());
最终列表l1=。。。;
最终列表l2=。。。;
最终列表结果=l1.stream()
.地图(地图->
{
最终映射r=新的HashMap(映射);
l2.stream()
.filter(map2->Objects.equals(map.get(“ACC_NUM”)、map2.get(“ACC_NUM”))
.findFirst()
.map(map2->map2.get(“是否处于活动状态”))
.ifPresent(is_active->map.put(“is_active”,is_active));
返回r;
})
.collect(Collectors.toList());
这里有一种方法:
List<Map<String, Object>> map3 = new ArrayList<>();
l1.forEach(map -> {
// clone the map to avoid mutating existing maps
Map<String, Object> temp = new HashMap<>(map);
// get the corresponding match in the second list
Optional<Object> value = l2.stream()
.filter(m -> m.containsValue(map.get("ACC_NUM")))
.findFirst().map(c -> c.get("IS_ACTIVE"));
temp.put("IS_ACTIVE", value.get()); // insert the new entry
map3.add(temp); // add the new map to the accumulator
});
List map3=new ArrayList();
l1.forEach(地图->{
//克隆地图以避免变异现有地图
Map temp=新的HashMap(Map);
//在第二个列表中获取相应的匹配项
可选值=l2.stream()
.filter(m->m.containsValue(map.get(“ACC_NUM”))
.findFirst().map(c->c.get(“是活动的”);
temp.put(“IS_ACTIVE”,value.get());//插入新条目
map3.add(temp);//将新映射添加到累加器
});
这实质上是枚举l1
(第一个列表)中的每个映射,并将整个映射克隆到一个新映射实例中,只需在该新映射中插入一个新条目,其中键为“is_ACTIVE”
,该值是我们在l2
(第二个列表)中找到的值
此解决方案假定在l2
中始终存在对应的匹配项,因此在可选
结果上调用get()
。但是,如果不是这样的话,你可以使用<代码>可选的“OR”/“代码”来提供默认值,或者如果未找到该值,则根本不想将该条目添加到该映射中,在添加到该映射之前考虑使用<代码>可选的“Y”/<代码>。p>
此外,我建议您熟悉可选API,当然还有两个地图或两个列表?您想如何合并会计科目?你试过什么?您卡在哪里?是的,使用帐户号,两个都是地图列表。对于每个地图值对象,它们都是不同的,如果您要合并地图,则需要一个新类型的对象,该对象包含以前两个对象的数据。给我们看看那些东西。此外,列表是否包含2个元素?如果是这样的话,你为什么需要一个列表?我喜欢它使用新的流API:-)-但我认为这可能是O(n*m),而我的,虽然是老式的,应该只有O(m+n).@Prateek你可以检查我的编辑,它部分等同于。@marsouf-非常感谢你+1,你能在没有java 8的情况下发布答案吗?