通过ID引用对象? (JAVA)

时间:2015-06-04 12:53:46

标签: java oop object simulation traffic-simulation

我不是Java-Newbie,但我无法理解最近出现的问题。

我必须用Java模拟道路系统。为了正确的OOP,我有一个班级汽车和一个街道(以及其他几个管理整个模拟当然^^)。我已经设法在一条路上模拟了一个果酱,并且没有遇到任何问题。

好的,问题出现了:我想将模拟从一条偏僻的街道扩展到道路系统。所以我想到了一个名为“RoadSystem”的类,它可能有一系列的街道和某种连接(我想到的是“结”),让汽车知道他们可以在他们到达街道尽头的地方开车。开车。

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

每一个帮助都非常感谢!

来自德国的问候,

Ruffy

1 个答案:

答案 0 :(得分:0)

您应该查看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;
}

最后,您可以设计Road-Network并将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){

   }
   ...
}