1

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

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

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

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

高度赞赏每一个帮助!

来自德国的问候,

鲁菲

4

1 回答 1

0

你应该看看 SourceCodeLinkedList并且也许适应这个原则。一条道路有 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。在模拟过程中,您不必关心具体实例,因为它们将在逻辑上连接。

(稍后您可以使用其他 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){

   }
   ...
}
于 2015-06-04T13:11:14.193 回答