将比较器从C#移植到Java

问题描述 投票:1回答:4

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

这里是C#中的代码

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

Java:

注意未调用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#的'next':

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是否等效?

java c# porting
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);
}

1
投票

否,因为Math.Sign in C#返回三个值之一:如果值<0,则返回-1;如果值等于0,则返回0;如果值大于0,则返回1。用与Java代码相同的方式乘以-1进行符号。

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


0
投票

如果您的Java版本的EquationGenome实现了Comparable接口,则可以利用许多Comparable。这会使您的班级看起来像这样:

Java APIs

然后,您对乘法所做的不清楚。我认为“自然秩序”是从最适合到最不适合。然后,我将像这样实现比较:

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; } 方法使用implement the equals method to be "consistent",或者清楚地记录您的类以记录不一致之处。如果实现equals,则也应保持compareTo的一致性。

equals

用于产生随机数的方法是正确的,只要您了解implement hashCode,该方法就会从半开间隔hashCode生成随机数。如果要在范围内包括public boolean equals(Object o) { return o instanceof EquationGenome && compareTo((EquationGenome) o) == 0; } public int hashCode() { return currentFitness; } ,请在max is excluded;中添加一个。


0
投票

我会写类似的东西。

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

max
© www.soinside.com 2019 - 2024. All rights reserved.