【问题标题】:Simulate Traffic on a Road (as array) in Java在 Java 中模拟道路上的交通(作为数组)
【发布时间】:2016-11-30 15:57:44
【问题描述】:

我有一个项目是创建一个长度不同的数组 aRoad。我需要通过这个数组移动元素并最终删除对象,当它到达aRoad [N]后面的元素时。

让我们假设: 我有许多对象(“汽车”)N 和一个长度为 L(=4)的数组(“道路”)。

i = 0: car1 is at road[0].  
i = 1: car1 is at road[1].  
i = 2: car1 is at road[2], car2 spawns at road[0].  
i = 3: car1 is at road[3], car2 is at road[1].  
i = 4: car1 vanishes from the road, car2 is at road[2], car3 spawns at road[0].  

我的汽车级:

package traffic;
public class Vehicle {

private int bornTime;
private char destination;  

public Vehicle(int bornTime, char destination){
    this.bornTime = bornTime;
    this.destination = destination;
}

public int returnTime() {
    return bornTime;
}

public char returnDest() {
    return destination;
}

public String toString() {
    System.out.print(destination);
    return null;
}   
}

我的问题是:一旦一个对象离开数组,我就会收到一个错误,因为索引超出了范围。我试图用一个 IF 条件来解决这个问题,感谢第一个答案,我能够创建代码更新。

我如何获得一个在 Java 中运行的系统?我的更新方法:

public static void main(String[] args) {
int time = 1;
char[] aRoad = new char[6]; // lane length
Vehicle[] carList = {new Vehicle(1, 'X'), new Vehicle(4, 'Y')};

    while(time < 15){
        for(Vehicle car : carList){
        if (car != null ){
            int pos = time - car.returnTime();
        if (pos >= 0){
            if (pos >= 1){
                aRoad[pos-1] = 0;
            }
            if (pos == (aRoad.length)){
                aRoad[pos-1] = 0;
                car = null;
            }
            if (car != null){
                aRoad[pos] = car.returnDest();
            }
        }
        }
        }
//PRINT ARRAY EACH ITERATION, SET time = time + 1
}

输出如下:

[...]
time = 6: [ ,  , Y,  ,  , X]
time = 7: [ ,  ,  , Y,  ,  ]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at traffic.Test1.main(Test1.java:19)

所以我的具体问题是:
如何在不将 X 对象 (-car) 设置为 null 的情况下防止此异常?

编辑 由于问题太不明确,我把所有无用的信息都扔掉了,整理一下。

【问题讨论】:

  • 您的问题到底是什么?现在它有被关闭的危险,因为它基本上太宽泛了。
  • 好的,更具体一点:例如,我需要每 2 秒构建一个 Vehicle 类的汽车。然后这些汽车将通过名为 road 的数组移动并在到达终点时被删除:a)我如何创建和标记例如 5 辆汽车?以及如何通过检查数组 [i+1] 是否未被占用来移动位置,以及,b) 如何在到达数组 [end] 时删除每辆车。是不是更具体?
  • 是的,这是特定的,也是 Java 基础。将自己限制在一个问题上,然后发布您在该问题上的当前进展。

标签: java arrays object


【解决方案1】:

我会回答你最明确的问题,希望这个答案能让你朝着正确的方向前进。

但我如何才能真正创造出大量行驶在路上的汽车呢?

您可能会卡在这里,因为您没有使用 Vehicle 对象的 borntime 字段。对于 while 循环的每次迭代,汽车在道路上的新位置应该由

给出
current time - borntime

因此,如果您有多辆汽车,并且有一个 while 循环在您的时间维度上进行迭代

Vehicle car1 = new Vehicle(2, "X");
Vehicle car2 = new Vehicle(4, "Y");   
...
int time = 2;
while(time < 10){
   // calculate road positions
   int car1Pos = time - car1.returnTime();
   int car2Pos = time - car2.returnTime();

   aRoad[car1Pos - 1] = 0;
   aRoad[car1Pos] = car1.returnDest();

   aRoad[car2Pos - 1] = 0;
   aRoad[car2Pos] = car1.returnDest();
   ...
}

但是,当您的代码开始看起来如此重复时,最好考虑更多的数组和循环。将车辆放入“车辆数组”并循环遍历它以更新每辆车在数组中的位置

Vehicle[] carList = {new Vehicle(2, "X"), new Vehicle(4, "Y")};
...
int time = 2;
while(time < 10){
    for(Vehicle car : carList){
         int pos = time - car.returnTime();
         aRoad[pos-1] = 0;
         aRoad[pos] = car.returnDest();
    }
    ...
}

一旦你完成了这项工作,下一步就是动态地将车辆添加到carList,可能每两秒一次,并在它们到达路的尽头时将它们从carList 中删除。对于这部分,使用ArrayList 作为carList 会容易得多。

请注意,我没有测试过这段代码,所以它们可能是语法错误。

【讨论】:

  • 嘿!感谢您的答复!这首先真的很有帮助。我只是在尝试实施和扩展它,然后会给你进一步的反馈!
  • 按照您的建议,我创建了一个汽车列表。不这样做,但现在可以创建 2 辆离散汽车。使用列表,它仍然崩溃(见上文)。这个 for(Vehicle car : carList) 在 Java 中究竟是如何工作的?我用更好的代码摘录更新了我的问题。
  • 您需要另一个if 语句来检查车辆的位置是否仍在您的道路阵列范围内。如果是,您可以移动它的目标字符。如果不是,您应该从道路数组中删除它的字符。 for 循环只是一个简化的符号,见stackoverflow.com/questions/5851025/…
  • 我现在对您告诉我的内容以及如何实施它感到非常满意。如果我可能会问关于数组中对象声明的另一件事。当汽车对象从最后一个位置删除时,我想调用一个方法来告诉我它花了多少时间步来移动数组。如果我有无限的对象流通过,如何调用位于最后一个数组上的对象?类似:IF carX on aRoad[end], THEN call carX.getInformation() THEN set carX = null 但我不知道汽车的索引?
  • 按照现在的设置方式,您将无法判断某个特定的 Vehicle 对象何时在您的道路尽头。您需要某种方式将您的 Vehicle 对象与其在道路上的状态联系起来。一个简单的解决方案是在您的 Vehicle 对象中添加一些字段 int roadPosition 来存储车辆在您的道路上的当前位置,以及一些方法 moveVehicle(int newRoadPos) 允许您在需要时更新位置。然后,您可以通过vehicle.getRoadPosition() == aRoad.length - 1 之类的某种检查来检查车辆是否在路的尽头
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 2021-11-14
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2017-01-03
  • 2014-10-07
  • 2020-08-13
相关资源
最近更新 更多