【发布时间】:2020-02-13 18:30:15
【问题描述】:
我目前正在做一个火车项目,我有以下问题:
我将所有机车车辆保存在一个列表中: 为了更好地理解我的类层次结构,这里有一个简化的继承概述:
RollingStock
Engine
SteamEngine
DieselEngine
...
Coach
FreightCoach
PassengerCoach
...
TrainSet
在我的寄存器中,我想将所有机车车辆保存在列表中 private List<RollingStock> rollingStock;。到目前为止,我已经为每种机车车辆类型(引擎、教练、火车组)创建了一个列表。但是,我需要删除某个机车车辆及其 ID,因此将所有内容保存在一个列表中会更容易。
和以前一样,我创建了一个这样的引擎:
public void createEngine(Engine engine) {
this.engines.add(engine);
}
现在,只有一个列表,我这样做:
public void createEngine(Engine engine) {
this.rollingStocks.add(engine);
}
这工作得很好。对于 returnEngines() 方法,我似乎没有找到解决方案:
每个机车车辆类型都有一个列表,就这么简单:
public List<Engine> returnEngines() {
return engines;
}
现在,我必须从机车车辆列表中过滤掉所有引擎:
public List<Engine> returnEngines() {
...
return rollingStock.???;
}
我可以添加方法public String getType() 并检查它的类型。
我无法想象没有更好的解决方案。
如何做到这一点?
【问题讨论】:
-
你的股票列表中的股票顺序有什么价值吗?如果没有,我认为您最好使用
Sets。我的另一个建议是,如果您想要引擎和机车车辆(等)的集合,您可以将机车车辆制作为合成集合,在内部由其他集合组成。 -
使用
Set的优势是什么?它将如何解决我的问题? -
首先,您可以使用 Set 自动防止重复。另一方面,确认对象在集合内会更快。第三件事是,如果您不需要在组合集合上定义顺序,则可以更轻松地将基础集合(SteamEngines、DieselEngines 集合)组合在一个集合中。这如何帮助解决您的问题?使用一组基础集合,您可以将集合用于所有 RollingStock 的操作,但是当您只需要引擎时,您可以只使用该集合,而不必按照 Frisch 的回答进行过滤
-
谢谢,这将解决我的问题。例如,当我列出所有火车(按其 ID)时,我还能对集合进行排序吗?我怎样才能合并我所有的集合? MergeSets() 只能用来合并两个集合,对吧?
-
集合被定义为无序,排序没有意义。您可以做的是使用 List.addAll(...) 将集合中的所有内容添加到列表中以进行排序。至于合并,我建议您创建一个实现
Set的类,并使用属于您的较大Set的一部分的其他集合来实现Sets 方法@
标签: java generics inheritance