【问题标题】:Java build List from values of multiple Maps in a particular orderJava以特定顺序从多个地图的值构建列表
【发布时间】:2011-01-25 15:24:01
【问题描述】:

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

您还有两个 Map,其中整数键是 List1 的子集。两个 Map 之间没有重叠,但在它们之间,List1 可能是它们两个 keySet 的集合的适当超集(即,两个 Map 中都缺少 List1 中的一些整数)。

如何从两个 Map 中构建一个新的对象列表,其中对象按照其 Integer 键在 List1 中出现的顺序出现?

【问题讨论】:

  • 您希望list2 包含映射中的键或值吗?
  • List1 上缺少的元素怎么办,您希望它们出现在结果列表中吗?

标签: java algorithm


【解决方案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));
}

上面的代码被简化了,但你应该明白了。

【讨论】:

  • 糟糕,OP 想要的是值,而不是键
  • @Sean,是的。看见了。会修复的。
  • 好的,现在你的解决方案和jzd的差不多
  • @Sean,是的。我相信它实际上是相同的。 (但我的有代码)
【解决方案2】:
  1. 为您的对象创建一个列表。
  2. 遍历列表并在两个地图中检查对象。
  3. 哪个地图有匹配项将该对象添加到您的新列表中。

【讨论】:

    【解决方案3】:
    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);
    

    用 containsKey 更新,看起来很花哨。

    【讨论】:

      【解决方案4】:

      使用SortedMap:

      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.keySet(): 返回一个集合 包含在此中的键的视图 地图。集合的迭代器返回 键按升序排列。套装是 由地图支持,因此更改为 地图反映在集合中,和 反之亦然。 [...] 套装支持 元素移除,即移除 地图中的对应映射, 通过 [...] retainAll,并清除 操作。

      Set.retainAll(): 只保留 该集合中的元素是 包含在指定集合中 (可选操作)。换句话说, 从这个集合中移除它的所有 不包含在 指定集合

      SortedMap.values():返回Collection 视图 此映射中包含的值。这 集合的迭代器返回 值按升序排列 对应的键。该系列是 由地图支持,因此更改为 地图反映在集合中, 反之亦然。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 2011-09-13
        • 2020-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多