我正在尝试将这些小的数学调用从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的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);
}
否,因为Math.Sign in C#返回三个值之一:如果值<0,则返回-1;如果值等于0,则返回0;如果值大于0,则返回1。用与Java代码相同的方式乘以-1进行符号。
在C#中,CompareTo函数期望-1表示被调用的对象小于要传递的对象。由于您要返回从值2减去值1的符号,因此将被切换。考虑到您的Java代码,我怀疑这是您想要的算法。传统上,您会从值1中减去值2并使用该符号。
如果您的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;中添加一个。
我会写类似的东西。
注意:使用比较器和可变字段时要非常小心,因为这可能会产生不良的副作用。
max