3

C#ライブラリをJavaに移植しています(非線形回帰の場合、元のコードはこちら)。ライブラリは、Javaには存在しないFunc<>クラスを使用します。IE(A、B、C、およびD、および時間は回帰に使用されるパラメーターであり、修正する必要はありません。)

Func<double>[] regressionFunctions = new Func<double>[]
{() => A * Math.Exp(time) * Math.Sin(B * time),
() => C * Math.Exp(time) * Math.Cos(D * time)}; 

私がやりたいのは、これをJavaコードに変換することです。匿名の内部クラスを作成することについて何かを見ましたが、この特定の状況の正しい使用法がわかりません。方程式を後で評価できるようにしたいと思います(特定のtの値に対して)。新しいクラス、インターフェースが必要ですか、それとも最良のメソッドは何ですか?どんな助けでもいただければ幸いです!前もって感謝します。

4

3 に答える 3

2

ライブラリにそのインターフェイスがすでにあるかどうかはわかりませんが、次のようなことができます。

interface Func<T> {
    T appy();
}

そして言う:

Func<Double>[] funcs = new Func<Double>[] {
    new Func<Double> { @override Double apply() { ... } },
    new Func<Double> { @override Double apply() { ... } }
};

その後、それらに適用を呼び出します。注:私はjavaよりもはるかに多くのc#を記述しており、Javaコンパイラーが手元にないため、その配列のインスタンス化では構文がオフになっている可能性がありますが、私の意味を理解できれば幸いです。

于 2012-06-20T17:26:32.483 に答える
2

独自のインターフェースを定義し、匿名の実装を使用してコードを移植できます。

// Declaring the interface
interface FuncDouble {
    double calculate();
}

public LevenbergMarquardt(FuncDouble[] regressionFunctions, ...) {
    // Using the functor:
    double functionValue = _regressionFunctions[i].calculate()
}

// Declaring an array of functors:
FuncDouble[] regressionFunctions = new FuncDouble[] {
    new FuncDouble() {
        public double calculate() {
            return A * Math.Exp(time) * Math.Sin(B * time);
        }
    }
,   new FuncDouble() {
        public double calculate() {
            return C * Math.Exp(time) * Math.Cos(D * time);
        }
    }
};

実装が機能するためには、、、、、、および変数がインスタンス/クラス変数であるか、ローカル変数である必要がありAます。BCDtimefinal

于 2012-06-20T17:28:34.900 に答える
0

ジェネリックスを使用してインターフェイスをいつでも作成し、その実装を渡すことができます。「Javaには存在しない」という回避策があります。

public interface Func<T> {
   T evaluate(Object...params);
}

Callable<T>また、クラスを見るかもしれません。

于 2012-06-20T17:14:15.123 に答える