1

関数A、関数B、関数Cがあります

Mainからこれらの関数の1つ(AまたはBまたはC)をランダムに呼び出そうとしています。

どうすればそれを行うことができますか?

関数をFunctionListという配列リストに入れることはできますか

次に、次のことを行いますか?

int x = (int)(Math.random() * Functionlist.size());
FunctionCall = FunctionList.get(x) 
4

3 に答える 3

2

関数の数が少ない場合、最も簡単な方法はswitch、、

switch((int)(Math.random()*NUM_FUNCTIONS) {
    case 0:
        functionA();
        break;
    case 1:
        functionB();
        break;
  //  ...
}
于 2012-08-01T23:26:08.443 に答える
0

私は、関数オブジェクトを標準的な方法で模倣します。これFunction<T>は、メソッドを使用してインターフェイスを実装する-おそらく匿名の-クラスを作成するか、引数がない場合はcall(T arg)さらに作成します。Runnableそれらのインスタンスはコレクションに入れることができます

于 2012-08-02T07:15:47.160 に答える
0

Javaは関数ポインタをサポートしていません。回避策の1つは、関数に系統的に名前を付けることです。つまり、f1、f2、f3などです。次に、そのパターンに基づいてメソッドオブジェクトを作成します。たとえば、関数名f1、f2、f3を使用すると、次のように実行できます。

java.lang.reflect.Method method;
try {
  methodName = "f" + String.valueOf((int) Math.random()*NUM_FUNCTIONS);
  method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..); 
} catch (SecurityException e) {
  // ...
} catch (NoSuchMethodException e) {
  // ...
}

次に、次のように関数を呼び出します。

try {
  method.invoke(obj, arg1, arg2,...);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {

*この回答はここから多用されています。

于 2012-08-01T23:37:18.533 に答える