gpt4 book ai didi

java - 如何按照列表描述的顺序有效地处理HashMap?

转载 作者:行者123 更新时间:2023-12-01 21:37:15 25 4
gpt4 key购买 nike

这是我的问题:我有一个按时间顺序排列的事件名称列表,例如:

ArrayList<String> eventsOrder = new ArrayList<>(Arrays.asList("event1", "event2", "event3", "event4", "event5"));

我有有关事件的数据的 HashMap,其中 key 是事件名称,例如:

HashMap<String, String> eventsData = new HashMap<>();
eventsData.put("event2", "data2");
eventsData.put("event1", "data1");
eventsData.put("event3", "data3");

我还有一个方法将 2 个事件的数据合并为 1 个:

public String merge(String previousEventsData, String nextEventsData);

我需要将所有事件的数据按时间顺序合并到一个对象中。所以在这种情况下,它会是这样的:

merge(merge("data1", "data2"),"data3");

这就是我现在解决这个问题的方法:

首先,此 HashMap 可能包含也可能不包含有关所有事件的数据,因此我过滤可用事件的名称:

ArrayList<String> eventsToProcess = eventsOrder.stream()
.filter(eventName -> eventsData.containsKey(eventName))
.collect(Collectors.toCollection(ArrayList::new));

然后我使用这个丑陋的算法按时间顺序合并事件数据:

    String finalData = "";

int eventsCount = namesToProcess.size();

finalData = eventsData.get(namesToProcess.get(0));
if(eventsCount > 1) {
for (int i = 1; i < eventsCount; i++){
finalData = merge(finalData, eventsData.get(namesToProcess.get(i)));
}

}

不是很优雅和可读,对吧?

问题:我如何使用 Java 流或递归函数进行相同的处理?

最佳答案

像这样的东西应该是等​​效的,使用 Stream.reduce :

eventsOrder.stream()          // "event1", "event2", "event3", "event4", "event5"
.map(eventsData::get) // "data1", "data2", "data3", null, null
.filter(Objects::nonNull) // "data1", "data2", "data3"
.reduce(YourClass::merge) // merge(merge("data1", "data2"), "data3")
.get() // gets the result from the Optional

Optional.get如果没有带数据的事件,方法会抛出 NoSuchElementException;在这种情况下,原始代码的 namesToProcess.get(0) 将抛出 IndexOutOfBoundsException 。假设您的 eventsData map 没有任何 null 值,这应该是行为上的唯一区别。

关于java - 如何按照列表描述的顺序有效地处理HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60143600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com