2

から値を返し、loop中断したところから続行する方法はありますか?

次のスニペットでは、 の現在の値を返しますcurrVm。しかし、私はそうすることができません。

スニペットの最も内側のループ:

while(c <= currVm) {
   allocatedVm(currVm);
   c++;
}

という名前の関数allocatedVmが呼び出されます。の値を返して、currVm中断したところから再開したい。抜け道はありますか?

@Override
public int getNextAvailableVm() {
    Set<String> dataCenters = confMap.keySet();
    for (String dataCenter : dataCenters) {
        LinkedList<DepConfAttr> list = confMap.get(dataCenter);
        Collections.sort(list, new MemoryComparator());
        int size = list.size() - 1;
        int count = 0;
        while(size >= 0) {
            DepConfAttr dca = (DepConfAttr)list.get(count);
            int currVm = dca.getVmCount();
            int c = 0;
            while(c <= currVm) {
                allocatedVm(currVm); // RETURN currVm
                c++;
            }
            count++;
            size--;
        }
    }        
}
4

3 に答える 3

2

最善のアプローチは、おそらく を返すメソッドを作成することIterable<Integer>です。Java では、ジェネレーター関数をサポートする言語 (C# や Python など) ほど簡単ではありませんが、それでも実行可能です。コードが短い場合は、(ネストされた) 匿名内部クラスのペアで問題を解決できます。

public Iterable<Integer> foo() {
    return new Iterable<Integer>() {
        @Override public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                // Implement hasNext, next and remove here
            };
        }
    };
}

あなたの場合、簡単にするために、別の非匿名クラスに分割したくなるでしょう。

とにかく、使用のポイントはIterableIterator 自然に状態を持っているということです-それが基本的にその目的です。したがって、それはあなたの要件にぴったりです。

もう 1 つのかなり単純な方法は、すべての要素を一度に返し、呼び出し元に要求に応じて割り当てを実行させることです。膨大な数の要素が存在する可能性がある場合、明らかにうまく機能しませんが、理解しやすいでしょう。

于 2013-08-31T07:09:06.097 に答える
0

あなたが何を必要としているのかよくわかりませんが、

メソッドの実行中に値を取得したことをメソッドの呼び出し元に通知したいが、まだメソッドを終了したくない場合は、リスナーを使用できます。

関数へのパラメーターとしてインターフェイスを作成し、オブジェクトをパラメーターとして持つ関数を内部に持つだけです。

例:

interface IGotValueListener 
  {
  public void onGotValue(MyClass obj); 
  }

public int getNextAvailableVm(IGotValueListener listener)
  {
  ...
  if(listener!=null)
    listener.onGotValue(...);
  }

メソッドを呼び出すには、次のようにします。

int finalResult=getNextAvailableVm(new IGotValueListener ()
  {
  ... //implement onGotValue
  };
于 2013-08-31T07:14:30.123 に答える
-1

returnキーワードを入れるだけで、メソッドのどこからでも戻ることができます。別の場所からメソッドを再開する機能を配置したい場合は、メソッドをそのように因数分解する必要があります。labelsandifステートメントを使用し、いくつかの静的変数を設定して、最後の実行場所をマークすることができます。アプリケーションがマルチスレッド化されていない場合、静的変数同期の使用について心配する必要はありません。また、メソッドが大きすぎて読みづらくなっている場合は、小さなメソッドに分割することを検討してください。

于 2013-08-31T07:01:26.123 に答える