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/