Java以特定顺序从多个映射的值构建列表

Java以特定顺序从多个映射的值构建列表,java,algorithm,Java,Algorithm,假设您有一个按有意义顺序排列的整数列表(列表1) 您还有两个映射,其中整数键是List1的子集。两个映射之间没有重叠,但在它们之间,List1可能是它们两个键集集合的适当超集(即,List1中的某些整数在两个映射中都丢失) 如何从两个映射中构建新的对象列表,在这两个映射中,对象按其整数键在列表1中的显示顺序显示 为对象创建一个列表 循环浏览列表并检入对象的两个贴图 哪个地图有匹配项,请将该对象添加到新列表中 为对象创建一个列表 循环浏览列表并检入对象的两个贴图 哪个地图有匹配项,请将该对象添加到

假设您有一个按有意义顺序排列的整数列表(列表1)

您还有两个映射,其中整数键是List1的子集。两个映射之间没有重叠,但在它们之间,List1可能是它们两个键集集合的适当超集(即,List1中的某些整数在两个映射中都丢失)

如何从两个映射中构建新的对象列表,在这两个映射中,对象按其整数键在列表1中的显示顺序显示

  • 为对象创建一个列表
  • 循环浏览列表并检入对象的两个贴图
  • 哪个地图有匹配项,请将该对象添加到新列表中
  • 为对象创建一个列表
  • 循环浏览列表并检入对象的两个贴图
  • 哪个地图有匹配项,请将该对象添加到新列表中

  • 您只需使用一个循环即可完成此操作:

    Map map1;
    Map map2;
    List list2;
    // iterate through all of the possible keys in order
    for(Object possibleKey: List1) {
        // If the possible ke is a key in one of the maps,
        // add it to your new list.  This will preserve order.
        if(map1.containsKey(possibleKey))
            list2.add(map1.get(possibleKey));
        else if (map2.containsKey(possibleKey))
            list2.add(map2.get(possibleKey));
    }
    

    上面的代码已简化,但您应该了解其基本思想。

    您只需使用一个循环即可完成此操作:

    Map map1;
    Map map2;
    List list2;
    // iterate through all of the possible keys in order
    for(Object possibleKey: List1) {
        // If the possible ke is a key in one of the maps,
        // add it to your new list.  This will preserve order.
        if(map1.containsKey(possibleKey))
            list2.add(map1.get(possibleKey));
        else if (map2.containsKey(possibleKey))
            list2.add(map2.get(possibleKey));
    }
    
    List<MyObj> l = new ArrayList<MyObj>();
    for(Integer i: list1)
       MyObj o = (map1.containsKey(i))?map1.get(i):map2.get(i);
       if(o!=null)
         l.add(o);
    
    上面的代码被简化了,但您应该了解了大概的意思。

    List l=new ArrayList();
    
    List<MyObj> l = new ArrayList<MyObj>();
    for(Integer i: list1)
       MyObj o = (map1.containsKey(i))?map1.get(i):map2.get(i);
       if(o!=null)
         l.add(o);
    
    for(整数i:list1) MyObj o=(map1.containsKey(i))?map1.get(i):map2.get(i); 如果(o!=null) l、 添加(o);

    用containsKey更新,看起来很新奇。

    List l=new ArrayList();
    for(整数i:list1)
    MyObj o=(map1.containsKey(i))?map1.get(i):map2.get(i);
    如果(o!=null)
    l、 添加(o);
    

    用containsKey更新,看起来很新奇。

    使用: SortedMap的好处在于,它的所有集合视图都是a)排序和 b) 由映射支持,这使得很容易将映射值限制为列表中的值,并按正确的顺序检索值:

    // create a SortedMap
    SortedMap<Integer,Object> sortedMap = new TreeMap<Integer, Object>();
    // add the entries of the first map
    sortedMap.putAll(map1);
    // add the entries of the second map
    // (all entries are now sorted by key)
    sortedMap.putAll(map2);
    // now remove all entries that are not in List1
    sortedMap.keySet().retainAll(list1);
    // and here's your list of the values, sorted by key
    List<Object> arrayList = new ArrayList<Object>(sortedMap.values());
    
    //创建一个分类地图
    SortedMap SortedMap=新树映射();
    //添加第一个映射的条目
    分类地图putAll(地图1);
    //添加第二个映射的条目
    //(所有条目现在按键排序)
    分类地图putAll(地图2);
    //现在删除列表1中没有的所有条目
    sortedMap.keySet().retainAll(列表1);
    //这是您的值列表,按键排序
    List arrayList=新的arrayList(sortedMap.values());
    
    参考: :返回一个集合 此文件中包含的密钥的视图 地图。集合的迭代器返回 按升序排列的键。布景是 以地图为后盾,因此对 映射反映在集合中,和 反之亦然。[…]该集合支持 元素移除,它移除 从地图上对应映射, 通过[…]保留,然后清除 行动

    :仅保留 此集合中的元素是 包含在指定的集合中 (可选操作)。换句话说,, 从此集合中删除其所有属性 中不包含的元素 指定的集合

    :返回集合的
    视图
    此映射中包含的值。这个
    集合的迭代器返回
    值按
    相应的键。藏品是
    以地图为后盾,因此对
    地图反映在收藏中,
    反之亦然

    使用: SortedMap的好处在于,它的所有集合视图都是a)排序和 b) 由映射支持,这使得很容易将映射值限制为列表中的值,并按正确的顺序检索值:

    // create a SortedMap
    SortedMap<Integer,Object> sortedMap = new TreeMap<Integer, Object>();
    // add the entries of the first map
    sortedMap.putAll(map1);
    // add the entries of the second map
    // (all entries are now sorted by key)
    sortedMap.putAll(map2);
    // now remove all entries that are not in List1
    sortedMap.keySet().retainAll(list1);
    // and here's your list of the values, sorted by key
    List<Object> arrayList = new ArrayList<Object>(sortedMap.values());
    
    //创建一个分类地图
    SortedMap SortedMap=新树映射();
    //添加第一个映射的条目
    分类地图putAll(地图1);
    //添加第二个映射的条目
    //(所有条目现在按键排序)
    分类地图putAll(地图2);
    //现在删除列表1中没有的所有条目
    sortedMap.keySet().retainAll(列表1);
    //这是您的值列表,按键排序
    List arrayList=新的arrayList(sortedMap.values());
    
    参考: :返回一个集合 此文件中包含的密钥的视图 地图。集合的迭代器返回 按升序排列的键。布景是 以地图为后盾,因此对 映射反映在集合中,和 反之亦然。[…]该集合支持 元素移除,它移除 从地图上对应映射, 通过[…]保留,然后清除 行动

    :仅保留 此集合中的元素是 包含在指定的集合中 (可选操作)。换句话说,, 从此集合中删除其所有属性 中不包含的元素 指定的集合

    :返回集合的
    视图
    此映射中包含的值。这个
    集合的迭代器返回
    值按
    相应的键。藏品是
    以地图为后盾,因此对
    地图反映在收藏中,
    反之亦然


    是否希望
    list2
    包含映射中的键或值?列表1中缺少的元素如何,是否希望它们出现在结果列表中?是否希望
    list2
    包含映射中的键或值?列表1中缺少的元素如何,是否希望它们出现在结果列表中?哦,OP需要值,而不是值keys@Sean是的。我看到了。好的,现在你的解决方案和jzd的差不多了s@Sean是的。我相信事实上是一样的。(但我的有代码)哦,OP需要值,而不是keys@Sean是的。我看到了。好的,现在你的解决方案和jzd的差不多了s@Sean是的。我相信事实上是一样的。(但我的有密码)