Robocode HashTable/method 修改其中的值问题
Robocode HashTable/method modifying values in it issues
目前在 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 来增加每个对象的 lastSeen 变量的值。
方法如下:
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 来阻止该方法执行的原因。不知道这是什么原因..
还有其他有效且有效地做到这一点的方法吗?
存储计算值
在很多情况下,存储计算值的信息比存储计算值本身更好。例如,不是存储一个人的年龄(例如 20 岁),而是存储该人的生日(例如 5-5-95)。如果您存储某人的年龄,则必须每年更新一次。如果你存储生日,你可以随时计算年龄。
Robocode
回到手头的问题。不是存储一条信息的年龄(年龄),而是存储信息创建的时间(生日)。 ScannedRobotEvent
有一个 getTime()
方法,您可以使用它来获取扫描事件的 "birthday"。存储此号码。然后,如果您需要知道存储的 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 并记得在有人完成新课程时更新它。
目前在 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 来增加每个对象的 lastSeen 变量的值。 方法如下:
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 来阻止该方法执行的原因。不知道这是什么原因..
还有其他有效且有效地做到这一点的方法吗?
存储计算值
在很多情况下,存储计算值的信息比存储计算值本身更好。例如,不是存储一个人的年龄(例如 20 岁),而是存储该人的生日(例如 5-5-95)。如果您存储某人的年龄,则必须每年更新一次。如果你存储生日,你可以随时计算年龄。
Robocode
回到手头的问题。不是存储一条信息的年龄(年龄),而是存储信息创建的时间(生日)。 ScannedRobotEvent
有一个 getTime()
方法,您可以使用它来获取扫描事件的 "birthday"。存储此号码。然后,如果您需要知道存储的 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 并记得在有人完成新课程时更新它。