【问题标题】:Java - fixing a bug in an "add" method that creates a new objectJava - 修复创建新对象的“添加”方法中的错误
【发布时间】:2014-05-16 14:12:21
【问题描述】:

有一个称为航班的 HashMap 和一个称为飞机的 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 字符串从 this.planes 中确定了分配给新航班的飞机,因此我创建了一个循环,遍历飞机 ArrayList 以检查名称是否匹配。我很确定这就是让我无法制作具有相同“飞机”的多个“航班”的原因,但我不知道我还能改变什么。我尝试添加这个额外的 if 语句,但它并没有像我想象的那样做。

else if (this.flights.keySet().contains(p.getID())) {
    newFlight = new Flight(p, departure, arrival); //In case it is a repeated Plane
} 

【问题讨论】:

    标签: java methods arraylist hashmap


    【解决方案1】:

    你需要这个

    HashMap<String,List<Flight>>
    

    而不是

    HashMap<String,Flight>
    

    这将帮助您在与planeID 映射的列表中维护多个Flight 实例

    【讨论】:

      【解决方案2】:

      Flights 是一个 HashMap。这是一种将项目存储在键/值对中的数据结构。在您的情况下,planeID 是关键。因此,当您插入一个新航班时,它会检查地图的内容,查看现有的飞机 ID 并在其位置插入您的新航班。这就是数据结构的工作原理。

      您需要使用更独特的东西作为键。可能是结合了飞机 ID 和一些出发细节的对象?

      【讨论】:

        【解决方案3】:

        为飞机创建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. 聚合:Octopus 建议的HashMap&lt;Plane, List&lt;Flight&gt;&gt;
          2. 关联:List&lt;Flight&gt;Plane 作为 Flight 类的成员。

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

        你应该选择最适合你的。

        希望这会有所帮助。

        【讨论】:

        • 谢谢,我会试试这个。为了将来参考,什么是判断应该使用哪一个的最佳方法?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 2021-03-16
        • 2020-12-07
        • 2018-04-23
        • 2023-04-05
        相关资源
        最近更新 更多