1

我正在尝试将这些小的数学调用从 C# 转换为 Java,并且只是想确保它们以相同的方式运行。我添加了一个额外的调用,因为它在 Java 中不受支持。

这是C#中的代码

public override int CompareTo(object a)
{
EquationGenome Gene1 = this;
EquationGenome Gene2 = (EquationGenome)a;
return Math.Sign(Gene2.CurrentFitness  -  Gene1.CurrentFitness);
}

爪哇:

注意 Math.Sign 没有被调用。

/**
* Compare to.
*/
public int compareTo(final Object a) {

    final EquationGenome gene1 = this;
    final EquationGenome gene2 = (EquationGenome) a;
    return (int) ((-1.0) * (gene2.currentFitness - gene1.currentFitness));
}

这是在 Java 中使用两个 int 参数复制 C# 的“下一个”的方法:

public static final int nextInt(final Random r, final int min, final int max) {

    final int diff = max - min;
    final int n = r.nextInt(diff);
    return n + min;

}

这些方法从 C# 到 Java 是否等效?

4

4 回答 4

2

为什么不直接使用 Java 的 compareTo?这是假设 currentFitness 是 Integer 类型而不是原始类型 int。否则,您可以将其包装在 Integer 中。这不是最有效的方法,但对我来说更清楚。

/**
* Compare to.
*/
public int compareTo(final Object a) {

    final EquationGenome gene1 = this;
    final EquationGenome gene2 = (EquationGenome) a;
    return gene1.currentFitness.compareTo(gene2.currentFitness);
}
于 2009-04-14T16:54:37.960 回答
1

不,因为 C# 中的 Math.Sign 返回三个值之一:如果值 < 0,则返回 -1,如果值等于 0,则返回 0,如果值大于 0,则返回 1。它不会将符号翻转正如您在 Java 代码中所做的那样乘以 -1。

在 C# 中,CompareTo 函数期望 -1 表示调用它的对象小于传入的对象。由于您要返回从值 2 中减去值 1 的符号,因此这将被切换。鉴于您的 Java 代码,我怀疑这是否是您想要的算法。传统上,您会从值 1 中减去值 2 并使用该符号。

于 2009-04-14T16:50:22.837 回答
0

如果您的 Java 版本EquationGenome实现了该Comparable接口,您将能够利用许多Java API。这会将您的课程更改为如下所示:

final class EquationGenome
  implements Comparable<EquationGenome>
{
  ...
  public int compareTo(final EquationGenome gene2) ...

然后,你用乘法做什么还不清楚。我假设“自然顺序”是从最合适到最不合适。然后我会像这样实现比较:

public int compareTo(final EquationGenome that) {
  if (currentFitness == that.currentFitness) {
    /* TODO: Add more tests if there are other properties that distinguish
     * one EquationGenome from another (secondary sort keys). */
    return 0;
  } else 
    return (currentFitness > that.currentFitness) ? -1 : +1;
}

按照惯例,您应该将方法实现为equals与您的方法“一致”compareTo,或者清楚地记录您的类以注意不一致之处。如果你实现了equals,你也应该实现hashCode一致性。

public boolean equals(Object o) {
  return o instanceof EquationGenome && compareTo((EquationGenome) o) == 0;
}

public int hashCode() {
  return currentFitness;
}

产生随机数的方法是可以的,只要你明白max排除在外即可;该方法从半开区间生成随机数(min, max]。如果要包含max在范围内,请在diff.

于 2009-04-14T17:10:06.597 回答
0

我会写类似的东西。

注意:使用带有可变字段的 Comparator 时要非常小心,因为这可能会产生不良的副作用。

public class EquationGenome implenents Comparable<EquationGenome> {
    private final double currentFitness;
    public EquationGenome(double currentFitness) {
        this.currentFitness = currentFitness;
    }

    public int compareTo(EquationGenome eg) {
        return Double.compareTo(currentFitness, eg.currentFitness);
    }
}
于 2009-05-19T19:37:14.173 回答