Robocode HashTable /方法修改其中的值问题

时间:2015-11-19 05:00:34

标签: java robocode

目前在RObocode中我有一个哈希表,其名称为键,point2D对象为值。这些对象的一个​​属性是double lastSeen,它是自机器人被看到以来的时间。每次我扫描机器人时,我都会将此值设置为0,这个值也有助于我的雷达成为最老的扫描雷达。

public void onScannedRobot(ScannedRobotEvent e) {
        String name;
        EnemyInfo enemy = (EnemyInfo) enemies.get(name = e.getName());
        // if the enemy is not already on the hashtable, puts it on
        if (enemy == null) {
            enemies.put(name, enemy = new EnemyInfo());
        }

        enemy.bearing = e.getBearing();
        enemy.velocity = e.getVelocity();
        enemy.heading = e.getHeading();
        enemy.energy = e.getEnergy();
        enemy.lastSeen = 0;

上面是扫描机器人时将代码作为对象推入哈希表并将对象的lastseen属性设置为0的代码;

我创建了一个方法,通过返回所有对象的lastSeen变量的枚举并为每个变量添加一个变量来增加每个对象的lastSeen变量的值(乘以1)。 方法如下:

public static void advanceTime(EnemyInfo e) {
        if (!enemies.isEmpty()) {
            int i = 0;
            Enumeration enum3 = enemies.elements();
            do {
                (e = (EnemyInfo) enum3.nextElement()).lastSeen = (e = (EnemyInfo) enum3
                        .nextElement()).lastSeen + 1;
                i++;
                System.out.println("Added one to.." + i);
            } while (enum3.hasMoreElements());
        }
    }

但是,如果哈希表中没有任何内容,我就无法调用此方法,这就是为什么如果哈希表中没有任何内容,我会设置if来停止执行该方法。不知道这个的原因..

有效和高效地执行此操作的任何其他方法?

1 个答案:

答案 0 :(得分:1)

存储计算值

在很多情况下,最好存储信息以计算值而不是计算值本身。例如,不是存储一个人的年龄(例如20岁),而是存储该人的生日(例如5-5-95)。如果您存储某人的年龄,则必须每年更新一次。如果您存储生日,您可以随时计算年龄。

的Robocode

回到手头的问题。不是存储一条信息的年龄(年龄),而是存储信息的创建时间(生日)。 ScannedRobotEventgetTime()方法,可用于获取扫描事件的“生日”。存储此号码。然后,如果您需要知道存储的ScannedRobotEvent的年龄,请从当前时间减去此存储的时间。这将绕过对advanceTime方法的需求。要对此进行此更新enemy.lastSeen

public void onScannedRobot(ScannedRobotEvent e) {
    String name;
    EnemyInfo enemy = (EnemyInfo) enemies.get(name = e.getName());
    // if the enemy is not already on the hashtable, puts it on
    if (enemy == null) {
        enemies.put(name, enemy = new EnemyInfo());
    }
    enemy.bearing = e.getBearing();
    enemy.velocity = e.getVelocity();
    enemy.heading = e.getHeading();
    enemy.energy = e.getEnergy();
    enemy.lastSeen = e.getTime();

异常

在某些情况下,您希望存储计算值。 GPA就是一个很好的例子。 GPA是一个计算值,但要计算它,您需要访问某人已经采取的每个课程。在这种情况下,如果可以更快地存储GPA并记住在有人完成新课程时更新它。