有一个名为flights的HashMap和一个名为planes的ArrayList。如果用户输入this.planes中存在的平面名称,则该方法用于创建新航班。唯一的问题是,使用这种方法,无法创建具有相同飞机和不同到达/离开的两个航班。当您使用与前一个相同的平面创建新的Flight对象时,它将替换前一个。我想知道如何防止这种情况发生。
public void addFlight(String planeID, String departure, String arrival) {
Flight newFlight = null;
for(Plane p : this.planes) {
if(p.getID().equals(planeID)) {
newFlight = new Flight(p, departure, arrival);
}
}
flights.put(planeID, newFlight);
}
由于输入的planeID字符串确定了分配给新Flight的this.planes的平面,因此我创建了一个循环,该循环遍历ArrayList平面以检查名称是否匹配。我很确定这就是让我无法制作多个航班"有相同的" Plane"但我不知道还能改变什么。我尝试添加这个额外的if语句,但它没有做我想的那样。
else if (this.flights.keySet().contains(p.getID())) {
newFlight = new Flight(p, departure, arrival); //In case it is a repeated Plane
}
答案 0 :(得分:3)
你需要这个
HashMap<String,List<Flight>>
而不是
HashMap<String,Flight>
这将有助于您在使用Flight
planeID
个实例
答案 1 :(得分:0)
Flights是一个HashMap。这是一个以键/值对存储项目的数据结构。在您的情况下,planeID是关键。因此,当您插入新航班时,它将检查地图的内容,查看现有的飞机ID&amp;将新航班插入其中。它是数据结构的工作原理。
您需要使用更独特的东西作为关键。组合平面ID&amp;一些离职细节或许?
答案 2 :(得分:0)
为飞机和HashMap
航班创建ArrayList
。
您的设计将更加简化,您将获得预期的行为。
添加代码将成为
public void addFlight(String planeID, String departure, String arrival) {
flights.add(planes.get(planeID), departure, arrival);
}
无需搜索,检查或担心。
祝你好运。编辑以回复评论:
HashMap
的键。所以独一无二的w.r.t.密钥应放在HashMap
中。在这种情况下是飞机。HashMap<Plane, List<Flight>>
,如Octopus建议List<Flight>
Plane
作为Flight
班级的成员。这两种选择都很容易使用,但在第一选择中,您在飞行舱内的飞机参考是多余的。所以我会选择第二个选择。
你应该选择最适合你的人。
希望这有帮助。