2009-04-14 9 views
1

私はこれらの小さな数学の呼び出しをC#のJavaに変換しようとしていますが、同じ方法で動作することを確認したかっただけです。私はJavaでサポートされていないので、追加の呼び出しを1つ追加しました。コンパイラをC#からJavaに移植する

お知らせMath.Signが呼び出されていない。ここで

は、C#のコード

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

Javaのです。

/** 
* 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)); 
} 

そしてここで1は、C#の "s 'はJavaで2つのint型のパラメータを持つ' 次を複製することです:

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; 

} 

は、JavaのC#から同等のこれらのメソッドはありますか?

答えて

1

いいえ、C#のMath.Signは、値が<の場合は-1、値が0の場合は0、値が0より大きい場合は1のいずれかを返します。 Javaコードで行っているように、-1を掛けて符号を反転させます。

C#では、CompareTo関数が-1を指定すると、呼び出されるオブジェクトが渡されるオブジェクトよりも小さいことを意味します。値2から値1を減算する記号を戻すので、これは切り替わります。私はこれがあなたのアルゴリズムに必要なものであるとは思わない。あなたのJavaコードがあれば。伝統的には、値1から値2を減算し、その符号を使用します。

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); 
} 
+0

いいえ、私は当時考えていませんでした。 –

+0

私は少し混乱しています... JavaコードをC#に変換するこの質問のポイントはありませんか? –

+0

"to Java from C#" – CookieOfFortune

0

EquationGenomeのあなたのJavaバージョンが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; 
} 

が、あなたはどちらかあなたのcompareTo方法でimplement the equals method to be "consistent"が、あるいは明確に矛盾を注意することは、あなたのクラスをドキュメント化する必要があります。そして、私はこのような比較を実施したいです。 equalsを実装する場合は、一貫性のためにimplement hashCodeも指定する必要があります。

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

public int hashCode() { 
    return currentFitness; 
} 

乱数を生成するための方法は、限り、あなたはmax is excluded;方法は半開区間(min, max]から乱数を生成することを理解し、大丈夫です。範囲にmaxを含める場合は、diffに1を追加します。

0

私は次のような記述をします。

注:誤った副作用がある可能性があるため、コンパレータには可変フィールドを使用することに非常に注意が必要です。

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); 
    } 
} 
関連する問題