簡體   English   中英

Robocode HashTable /方法在其中修改值的問題

[英]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)。 方法如下:

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)。 如果您存儲某人的年齡,則必須每年更新一次。 如果您存儲生日,則可以隨時計算年齡。

機器人代碼

回到眼前的問題。 而不是存儲一條信息的年代(年齡),而是存儲信息的創建時間(生日)。 ScannedRobotEvent具有getTime()方法,可用於獲取掃描事件的“生日”。 存儲此號碼。 然后,如果您需要知道存儲的ScannedRobotEvent年齡,請從當前時間中減去此存儲時間。 這將繞過對advanceTime方法的需要。 要實現此更新enemy.lastSeen ,請執行以下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的速度可能會更快,並且記得在有人完成新課程時更新它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM