java - 处理 2 个 map 中的数据以创建第 3 个 map

标签 java dictionary hashmap java-8

Map<String, List<myStruct>> map1 = ...;  
Map<String, List<myStruct>> map2 = ...; 

myStruct 有 2 个字段:时间戳和数字。

我需要使用在map1和map2中找到的键创建一个新的map3。对于每个键,每次 map1 和 map2 的时间戳匹配时,我都需要向 myStrcts 列表中添加一个新条目。该数量应等于map1 的数量除以map 2 的数量。

例如,如果它们每个都有 1 个条目:

Map<String, List<myStruct>> map1 = < "Cat" , < <1pm, 10> <2pm, 6>, <3pm, 8>>;  
Map<String, List<myStruct>> map2 = < "Cat" , < <1pm, 5> <2pm, 2>, <3pm, 1>>; 

然后

Map<String, List<myStruct>> map3 = < "Cat" , < <1pm, 2> <2pm, 3>, <3pm, 8>>; 

因为下午 1 点:10/5 = 2,下午 2 点:6/2 = 3,下午 3 点:8/1 = 8。

我尝试过使用 lambda 函数,但我无法想出任何好的和高效的东西。

我现在正在做的是迭代map1中的每个条目,然后迭代myStructs的每个时间戳 - 将其与map2中的时间戳进行比较,如果时间戳相等,则将结果添加到map 3。我正在尝试找出一个更有效的解决方案。

最佳答案

您可以循环 map1 的条目然后对map的值进行流式划分。

检查下面的代码

短代码

tmp结果是 List<myStruct>

 tmp = e.getValue()
        .stream()
        .map(struct -> new myStruct(struct.time, map2.get(e.getKey())
                                                           .stream()
                                                           .filter(x -> x.time.equals(struct.time))
                                                           .mapToInt(x -> struct.number / x.number)
                                                           .findFirst().getAsInt()))
        .collect(Collectors.toList());

长代码

public static void main(String[] args) {
    Map<String, List<myStruct>> map1 = new HashMap<>();
    Map<String, List<myStruct>> map2 = new HashMap<>();

    myStruct one = new myStruct("1pm", 10);
    myStruct two = new myStruct("1pm", 5);
    myStruct thr = new myStruct("2pm", 6);
    myStruct fou = new myStruct("2pm", 2);
    myStruct fiv = new myStruct("3pm", 8);
    myStruct six = new myStruct("3pm", 1);

    map1.put("Cat", Arrays.asList(one, thr, fiv));
    map2.put("Cat", Arrays.asList(two, fou, six));

    Map<String, List<myStruct>> map3 = new HashMap<>(map1);

    List<myStruct> tmp;

    for (Map.Entry<String, List<myStruct>> e : map1.entrySet()) {
         tmp = e.getValue()
                .stream()
                .map(struct -> new myStruct(struct.time, map2.get(e.getKey())
                                                                   .stream()
                                                                   .filter(x -> x.time.equals(struct.time))
                                                                   .mapToInt(x -> struct.number / x.number)
                                                                   .findFirst().getAsInt()))
                .collect(Collectors.toList());

         map3.put(e.getKey(), tmp);
    }

    System.out.println(map3); // {Cat=[<1pm, 2>, <2pm, 3>, <3pm, 8>]}
}

关于java - 处理 2 个 map 中的数据以创建第 3 个 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38021036/

相关文章:

java - elasticsearch包导入报错

java - 不正确的字符串加密/解密

java - 使用 LinearId 检索信息(对 Corda 节点的简单查询)

android - map android中的对话框

python - 创建新字典以首先对键进行排序,然后对值进行排序

java - 使用属性文件中的条目填充 HashMap

java - 独立迭代时,无序 HashMap 中的键和值是否对齐?

java - 无法访问 fbMain 类型的封闭实例。必须使用类型为 fbMain 的封闭实例来限定分配

java - HashMap 的KeySet、EntrySet 和values 都为null 而table 不为空

python - Python随机输出一个字典条目,如何临时删除?