【问题标题】:How to join two maps in java?如何在java中加入两个地图?
【发布时间】:2022-01-03 22:54:09
【问题描述】:

我有以下地图:

LonM =[0, 0, 0, 0, 46, 15]
LatM =[5, 52, 35, 16, 37, 5]

并行地,我已经实现了一个复合模式类:

public class CompositeDataFrame implements IDataFrame, ICompositeDataFrame {

    private String name;
    private List <IDataFrame> children;

    public CompositeDataFrame(String name){
        this.name = name;
        children = new LinkedList<>();
    }

    public void addChildren(IDataFrame child){
        children.add(child);
    }

我得到了如下查询方法:

public Map<Object, List<Object>> query(String keySelector, Predicate<Object> valuePredicate) {
    Map<Object, List<Object>> result = new HashMap<>();
    for (IDataFrame child:children)
        result.putAll(child.query(keySelector, valuePredicate));
    return result;
}

那么我们有以下调用查询方法的main:

CompositeDataFrame comp = new CompositeDataFrame("CompositeCities");
        CompositeDataFrame comp1 = new CompositeDataFrame("2");

        comp.addChildren(comp1);
        comp1.addChildren(df);
        comp.addChildren(df);
        
        System.out.println("\n"+comp.query("LonM", entry -> ((Integer) entry) == 0));

问题是:如何连接每个孩子的地图?

PD:我使用了 putAll 方法,但它删除了相同键的映射,因此在这种情况下它没有用。

输出应该是:

LonM =[0, 0, 0, 0, 0, 0, 0, 0] LatM =[5, 52, 35, 16, 5, 52, 35, 16]

非常感谢!

【问题讨论】:

  • 是的,我们有一个 Map,键是 LonM 和 LatM,值是 claudators 中的值

标签: java dataframe dictionary join composite


【解决方案1】:

是的,如果您使用putAll,它会删除具有相同键的映射条目。这就是地图的工作原理。您正在寻找的是一种按键对所有条目进行分组的方法,这对于Streams 来说有点容易。

Map<Object, List<Object>> result = children.stream()
        // Map from Stream<IDataFrame> to Stream<Map.Entry<Object, List<Object>>>
        .flatMap(child -> child.query(keySelector, predicate).entrySet().stream())
        // Collect back into a Map<Object, List<Object>> using groupinBy
        .collect(Collectors.groupingBy(
            // Use the key to group the values
            Map.Entry::getKey, 
            // Since we don't want a Map<Object, List<List<Object>>> the List needs to be flattend using Collectors.flatMapping.
            Collectors.flatMapping(entry -> entry.getValue().stream(), Collectors.toList())));

当然你不必使用Streams。

Map<Object, List<Object>> result = new HashMap<>();
for (IDataFrame child : children) {
    // Loop over each entry of the query result.
    child.query(keySelector, predicate).forEach((key, value) -> {
        // computeIfAbsent creates a new List if none exists for the given key, otherwise it returns the existing one.
        List<Object> valueList = result.computeIfAbsent(key, o -> new ArrayList<>());
        // Finally just add all the values to the list.
        valueList.addAll(value);
    });
}

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2023-03-10
    • 2011-01-07
    • 2011-08-05
    • 2019-01-15
    相关资源
    最近更新 更多