gpt4 book ai didi

java - 导航不同对象的复杂树的最佳方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:21 25 4
gpt4 key购买 nike

例如:

class Vehicle {
Collection<Axle> axles;
}

class Axle {
Collection<Wheel> wheels;
}

class Wheel {
// I think there are dually rims that take two tires -- just go with it
Collection<Tire> tires;
}

class Tire {
int width;
int diameter;
}

我有一个服务,通过它我可以获得我知道的所有 Vehicle 对象的集合。现在假设我有一个特定宽度和直径的轮胎,我想找到一辆可以承受它的车辆。最简单的方法是使用一组四个嵌套循环,如下所示:

for (Vehicle vehicle : vehicles) {
for (Axle axle : vehicle.getAxles()) {
for (Wheel wheel : axle.getWheels()) {
for (Tire tire : wheel.getTires()) {
if (tire.width == targetWidth
&& tire.diameter == targetDiameter) {
// do something
break;
}
}
}
}
}

有好的设计模式吗?或者使用更好的数据结构?将映射到车辆的轮胎信息的索引保留在某处会更好吗?

编辑:回答评论中的问题

Do you have control over the structure of the data you receive from the service?

Do you need to search for different tires multiple times in the same data?

Is performance an issue?

不是特别好

When you find the tire, do you just need to know which vehicle contains it or do you also need the axle and wheel?

有时只是车辆,有时只是车轴——两种不同的情况

Do you need the reference to the tire that was found?

是的,在我需要车轴的情况下

编辑2:进一步扩展这个比喻,解释上面的两个上下文:

情境 1 -- 我想知道这辆车,所以我可以派一个 worker 去取车并把它带回来

情境 2 -- 我想知道车轴和轮胎,因为我在车里试图做这项工作

最佳答案

您可以使用 Java 8 streams 来拉平循环.

vehicles.stream()
.flatMap(vehicle -> vehicle.getAxles().stream())
.flatMap(axle -> axle.getWheels().stream())
.flatMap(wheel -> wheel.getTires().stream())
.filter(tire -> tire.width == targetWidth
&& tire.diameter == targetDiameter)
.forEach(tire -> {
// do something
});

关于流的好处是你可以插入额外的filterfilterfindAny 等,很容易在流中的任何地方调用顺序。

关于java - 导航不同对象的复杂树的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641666/

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