1

クラスで5つの関数を定義しています。別のクラスでは、多くの文字列を含む入力ファイルで前述の各関数にかかる時間を計算しようとする複数のループ構造があります。

入力ファイルの各エントリについて、10回の呼び出しで各関数にかかる平均時間が計算されて出力されるような出力が必要です。したがって、出力は次のようになります-

inputString | function1AvgTime | f2AvgTimeなど。

これらの5つの関数すべてを1つの入力文字列に対してそれぞれ10回呼び出すエレガントな方法を理解することはできません。今私がしているように見えるのはこれです-

    for (inputString):
         for (iteration 1 to 10):
             call function 1
         for (iteration 1 to 10):
             call function2
    and so on....

関数名を配列またはデータ構造に格納し、単一の反復ループ内でそれらを呼び出す方法はありますか?とにかく私の仕事は終わっています。より良いデザインがあるかどうかだけ知りたいです。

4

2 に答える 2

4

Runnableインターフェイスを使用して、

void runMultipleTimes(Runnable run, int times) {
    for (int i = 0; i < times; i++) {
        run.run();
    }
}

次に、匿名のローカルクラスを使用して、個々の関数をラップします。

runMultipleTimes(new Runnable() {
    @Override
    void run() {
        function1();
    }
}, 10 /* how often to run */);

これは、JavaAPIとある程度一致しています。Runnableは、Javaがあらゆる場所で使用する主要なインターフェースです。同時に、それは通常一度だけ実行されると私は信じています。したがって、複数回実行できるようにするのはあなた次第です。

しかし、これまでのところ、コレクションにsforを格納する機能を除いて、明示的なループについてはあまり得られていません。Runnable

for (Runnable run : runCollection) {
    runMultipleTimes(run, 100);
}

Runnable自分でsを記述したくない場合は、Javaリフレクションを使用して、String名前で、または完全なイントロスペクションを介してメソッドを取得できます。基本的に、1つ Runnableを実行するものを作成しjava.lang.reflect.Methodます。Runnableアプローチは、次のようなこともできるため、もう少し柔軟です。

runCollection.add(new Runnable() {
    @Override
    void run() {
        function(123456);
    }
});

runCollection.add(new Runnable() {
    @Override
    void run() {
        function(654321);
    }
});

異なるパラメータで同じ関数を実行します。

于 2012-08-31T07:44:24.880 に答える
4

リフレクションを確認することをお勧めします:http://java.sun.com/developer/technicalArticles/ALT/Reflection/

クラスのメンバーを調べて、必要なメンバーに電話をかけることができます。特に、上記のリンクの「名前によるメソッドの呼び出し」セクションを参照してください。

于 2012-08-31T07:30:35.400 に答える