Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中组合两个不同的映射?_Java_Java 8 - Fatal编程技术网

如何在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查询,如果

  • 如果CreatedDate+30天>Sysdate,则在Trail中显示包含true->的列
  • 如果CreatedDate+30天超出试验期
  • “从客户账户客户、第三方客户、第三方客户中选择客户账户编号、第三方家长账户id、客户账户dt、客户更新dt、客户账户用户id” +“其中cust.updated_dt为空且cust.CRTE_dt
    我会创建一个
    地图
    来帮助解决问题<代码>“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的情况下发布答案吗?