gpt4 book ai didi

java - 如何过滤映射并返回值列表

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

我正在尝试创建一个函数来过滤一个 map ,该 map 将字符串作为键,将 Flight 对象列表作为值,并返回字符串列表。 map 代表飞行路径,任务是找到从出发地到目的地的最短路径。航类等级有两个字段:出发地和目的地。因此,如果我发送纽约州维也纳的航类,我应该会得到一个包含 fligth1 和 Flight2 的列表。该函数接受两个参数(字符串原点、字符串目标)

map 中的键代表一个城市,而值是航类到达的位置,如下所示:

Map<String, List<Flight>> paths = new HashMap<>();

List<Flight> flightsToBerlin = new ArrayList<>();
List<Flight> flightsToVienna = new ArrayList<>();

Flight flight1 = new Flight("Vienna", "Berlin");
Flight flight2 = new Flight("Berlin", "New York");

flightsToBerlin.add(flight1);
flightsToVienna.add(flight2);


paths.put("Vienna", flightsToVienna);
paths.put("Berlin", flightsToBerlin);

诀窍在于要求它必须在一行中完成。这就是让我发疯的部分。我尝试过使用流,但在过滤 map 并找到目的地后我有点困惑,如下所示:

public List<Flight> findPath(String origin, String destination) {
return (List<Flight>) this.paths.entrySet().stream()
.filter(x -> x.getKey().equals(destination))..
}

我该如何继续?

最佳答案

你可以这样做:

return Stream.of(
paths.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.groupingBy(Flight::getStartingLocation))
).flatMap(flights ->
Stream.of(
new HashMap<>(Map.of(origin, new Flight(origin, origin)))
).peek(back ->
Stream.iterate(
List.of(origin),
list -> list.stream().flatMap(
now -> flights.getOrDefault(now, Collections.emptyList()).stream()
.filter(flight -> back.putIfAbsent(flight.getDestination(), flight) == null)
.map(Flight::getDestination)
).collect(Collectors.toList())
).filter(list -> list.contains(destination)).findFirst()
).map(back ->
Stream.iterate(
new Flight(destination, null),
now -> back.get(now.getStartingLocation())
)
.skip(1)
.takeWhile(flight -> !flight.getDestination().equals(origin))
.collect(Collectors.toList())
)
)
.map(ArrayList::new)
.peek(Collections::reverse)
.findFirst().get();

关于java - 如何过滤映射并返回值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59219406/

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