【问题标题】:Referring to Objects by an ID? (Java)通过 ID 引用对象? (爪哇)
【发布时间】:2015-06-04 12:53:45
【问题描述】:

我不是 Java 新手,但我无法理解最近发生的问题。

我必须用 Java 模拟道路系统。为了正确的 OOP,我有一个类 Car 和一个类 Street(当然还有其他几个来管理整个模拟^^)。我已经设法模拟了一条道路上的拥堵,并且没有任何问题。

好的,问题来了:我想将我的模拟从一条孤独的街道扩展到一个道路系统。所以我想到了一个名为“RoadSystem”的类,它可能有一系列街道和某种连接(我想到了“结”),让汽车在到达街道尽头时知道他们可以在哪里行驶继续开车。

问题是我不知道如何实现这些结。汽车必须能够问街上“嘿兄弟,我在你的尽头,我现在可以在哪里开车?”街道应该以某种方式知道哪个结引用了它,并询问它也连接到这个特定结的街道。我该如何做这个参考? 我想到了一个 ID,但是如果街道必须搜索每个节点的街道 ID 以便在那里找到自己的 ID,那么对于更大的道路系统来说,这可能会变得非常慢。还是我错过了解决问题的明显方法?

高度赞赏每一个帮助!

来自德国的问候,

拉菲

【问题讨论】:

  • 最终的答案取决于你想在模拟中加入的细节。它是否必须考虑车道方向和交叉路口(等)上的交叉车辆?还是说交叉路口只是一个抽象的东西,可以从一条路“切换”到另一条路?
  • 街道(及其交叉点)可以建模为 GRAPH introcs.cs.princeton.edu/java/45graph
  • @dognose 该解决方案应该很容易扩展到更多细节。

标签: java oop object simulation traffic-simulation


【解决方案1】:

你应该看看LinkedList 的SourceCode 并且也许适应这个原则。一条道路有 2 个连接点,而一个路口可能有 2 到 4 个?

Abstract class RoadElement{
  //abstract for simulation purpose, maybe randomized
  //calculation of next direction, etc.
}

class Road extends RoadElement{
  private RoadElement previous = null;
  private RoadElement next = null;
}

class Intersection extends RoadElement{
    private RoadElement northernConnection = null;
    private RoadElement easternConnection = null;
    private RoadElement southernConnection = null;
    private RoadElement westernConnection = null;
}

最后,您可以根据需要设计道路网络并连接道路元素。在模拟过程中,您不必关心具体的实例,因为它们会在逻辑上连接。

(您可以稍后通过额外的 RoadElements 改进这一点,例如速度有限的“曲线”、有停车时间的人行横道等)

例子:

   List<RoadElement> RoadMap = new LinkedList<RoadElement>();
   Road r1 = new Road();
   Intersection i1 = new Intersection();
   r1.setPrevious(i1);
   i1.setNorthernConnection(r1);
   ....

然后,在模拟过程中,您可以执行以下操作:

Car currentCar = getCurrentCar();
RoadElement re = currentCar.getLocation();
if (re instanceof Road){
  //can we drive "forward and backward?"
  if ((Road)re).getPrevious() != null){

  }

  if ((Road)re).getNext() != null){

  }
}else if (re instanceof Intersection){
   //check available outgoing roads
   if ((Intersection)re).getNorthernConnection() != null){

   }
   ...
}

【讨论】:

  • 感谢您的回答。帮助过我! :)
  • 如何实现 Car.getLocation 方法?我不需要代码,只要想法..
  • 当然,道路元素可以有汽车的集合,但我只是没有得到从汽车向上到街道/道路元素的连接......
  • @RuffyxNami Location 方法只是 RoadElement 的吸气剂。 - 每次您的模拟决定移动汽车时,将属性更新为最新访问的 RoadElement。
  • 还有一个,最后一件事。由于汽车必须对前面和后面的汽车做出反应,所以每个道路元素都应该有一个汽车集合,以便汽车能够轻松地找出它们前面/后面的汽车。如果一辆车改变了它的道路元素,我必须从前一个元素中删除这辆车并将它添加到卡片驱动的元素中。添加很容易,但我如何从收藏中准确删除这辆车?我考虑过迭代集合并检查有点像 if (car = carToRemove),这行得通吗?提前致谢。
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多