Java - 修复创建新对象的“添加”方法中的错误

时间:2014-04-04 10:11:01

标签: java methods arraylist hashmap

有一个名为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
} 

3 个答案:

答案 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);
}

无需搜索,检查或担心。

祝你好运。

编辑以回复评论:

  • 您正在使用平面ID作为HashMap的键。所以独一无二的w.r.t.密钥应放在HashMap中。在这种情况下是飞机。
  • 对于存储航班,有两种选择
    1. 聚合:HashMap<Plane, List<Flight>>,如Octopus建议
    2. 协会:List<Flight> Plane作为Flight班级的成员。

这两种选择都很容易使用,但在第一选择中,您在飞行舱内的飞机参考是多余的。所以我会选择第二个选择。

你应该选择最适合你的人。

希望这有帮助。