2017-05-07 22 views
-1

私の配列内のオブジェクトが以下の3つの方法で移動するシミュレーションを実行しています。私のシミュレーションは多くの反復を経ています(約30回)。つまり、私はmove()を30回実行しています。1回の呼び出しでメソッドを呼び出す

+1

はい、ブーリアンフラグが機能するはずですが、なぜ機能していないのかは、わかりやすいものではありません。有効な[mcve]を作成して投稿することを検討して、問題が正しく機能しない理由を確認してください。これは*小規模プログラムで、あなたの質問をコード形式のテキストとして掲示します。変更せずにコンパイルして実行するコードと、問題を直接示すコードです。 –

+1

ブール値をオブジェクトに移動します。各配列のオブジェクトリストをループします。または、Map を使用します。他に; OPに行列があり、オブジェクトがその行列に沿って移動するように見えますが、移動は1回しかできません。したがって、ループからブール値を取り除く。 – Frankie

+0

@HovercraftFullOfEelsありがとうございます。私はいくつかの追加コードを追加しました。私はCarnivoreクラスにあるmove()の実装を含め、すべてを一緒に呼び出すcycle()メソッドも含めました。まだこれを理解しようとしています!どんな助けもありがとうございます。 – mmuso

答えて

0

各動物が繰り返し1回だけ動くようにするには、すでに移動した動物をマークする必要があります。

今では、Ecosystemクラス全体に対して1つのブール値varしかありません。移動した各オブジェクトをマークするには不十分です。

Setを使用して、すでに移動した動物を保存することができます。

生態系のクラスでこれを追加します。

private Set<Animal> alreadyMoved; 

を次に、各サイクルの始めに、ゼロからスタートする新しいセットを作成します。moveメソッドで次に

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

これを行うには、いくつかの方法があります。

代わりに、ブールの3210
  1. 、各動物をそれが中に移動した最後の反復(NO)を含有する余分な整数フィールドを与える。

  2. 「がこの反復」およびその他を表す2つのecosystemアレイ、いずれかが「最後の反復」を表す。新しい反復の開始時にそれらを反転して "this iteration"配列をヌルにするか、単に新しい配列を割り当てて、古い配列をGCにします。

関連する問題