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() { ... } }
};

然后再打电话申请他们。注意:我编写的 c# 比 java 多得多,并且没有方便的 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);
        }
    }
};

为了使实现工作,ABCDtime变量必须是实例/类变量,或者是final局部变量。

于 2012-06-20T17:28:34.900 回答
0

您始终可以使用泛型创建接口并传递它的实现。有一些方法可以解决“Java 中不存在”的问题。

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

你也可以看看Callable<T>类。

于 2012-06-20T17:14:15.123 回答