2017-05-07 89 views
-1

我正在運行一個模擬,其中數組中的對象被以下三種方法移動。我的模擬經歷了許多次迭代(約30次)。這意味着我正在運行move()30次。每次迭代只有一次調用方法

+1

是的,一個布爾標誌應該工作,爲什麼它不工作是不是我很容易看到的東西。請考慮創建併發布有效的[mcve],以便我們瞭解爲什麼事情無法正常工作。這應該是一個* small *程序,將您的問題作爲代碼格式的文本發佈,代碼將在未經修改的情況下編譯和運行,以及直接向我們顯示您的問題的代碼。 –

+1

將布爾值移動到對象中。每個陣列上的循環對象列表。或者使用Map 。其他;看起來像OP有一個矩陣和對象沿着矩陣移動,但是他們只能移動一次。因此,從布爾循環中取出布爾值。 – Frankie

+0

@HovercraftFullOfEels謝謝。我添加了一些額外的代碼。我包含了我在Carnivore類中找到的move()的實現,並且我包含了我的cycle()方法,它將所有內容一起調用。仍試圖弄清楚這一點!任何幫助表示讚賞。 – mmuso

回答

0

如果你想每隻動物每次迭代只移動一次,那麼你需要標記哪些動物已經移動。

現在,您只有一個布爾變量用於整個Ecosystem類,但這不足以標記每個移動的對象。

您可以使用Set來存儲您已經移動的動物。在每個週期的開始。然後

private Set<Animal> alreadyMoved; 

,創建一個新的集從頭開始:

在生態系統類添加此

alreadyMoved = new HashSet<Animal>(); 

然後在移動方法:

public synchronized void move() { 

    for (int i = 0; i < row; i++) { 
     for (int j = 0; j < column; j++) { 

      if (ecosystem[i][j] != null) { 

       if (!alreadyMoved.contains(ecosystem[i][j]) { 

        // move it 

        alreadyMoved.add(ecosystem[i][j]); 

       } 

      } 

     } 
    } 
} 
0

以下是其他幾種方法:

  1. 代替布爾的,給每個動物一個包含最後一次迭代(無),它在移動一個額外的整數字段。

  2. 有2個ecosystem陣列,一個表示「本次迭代」,另一代表「最後一次迭代」。或者在新迭代開始時將它們翻轉並排除「this iteration」數組,或者只是分配一個新數組,然後讓舊數組進行GC'd。