2009-04-14 5 views
1

나는이 작은 수학 호출을 C#에서 Java로 변환하려고하며 같은 방식으로 작동하는지 확인하려고합니다. Java에서 지원되지 않기 때문에 하나의 추가 호출을 추가했습니다.C#에서 Java로 비교기를 이식하는 것

을 주목 Math.Sign라고하지 않을 : 여기


자바가

public override int CompareTo(object a) 
{ 
EquationGenome Gene1 = this; 
EquationGenome Gene2 = (EquationGenome)a; 
return Math.Sign(Gene2.CurrentFitness - Gene1.CurrentFitness); 
} 
을 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#에서 상응하는 이러한 방법 위치 :

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

그리고 여기에 하나가 자바에서 두 INT 매개 변수 'C#을's의 '다음에 복제하는 것입니다?

답변

1

아니요. C#의 Math.Sign은 값이 < 인 경우 -1을, 값이 0 인 경우 0을, 값이 0보다 큰 경우 1을 반환하기 때문에 아니요. Java 코드에서 -1을 곱하여 부호를 플립하십시오.

C#에서 CompareTo 함수는 -1이 전달되는 개체보다 작다는 것을 의미합니다. 값 2에서 값 1을 뺀 값을 반환하기 때문에이 값이 전환됩니다 . Java 코드가 주어지면 이것이 알고리즘에 대해 원하는지 의심 스럽습니다. 전통적으로 값 1에서 값 2를 빼고 그 부호를 사용합니다.

2

Java의 compareTo를 사용하지 않는 이유는 무엇입니까? 이것은 currentFitness가 int 유형이며 int 유형이 아님을 가정합니다. 그렇지 않으면 그냥 Integer로 감쌀 수 있습니다. 이것은 가장 효율적인 방법은 아니지만 그것은 나에게 더 분명합니다. EquationGenome의 자바 버전이 Comparable 인터페이스를 구현하는 경우

/** 
* 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

, 당신은 많은 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에 하나를 추가하십시오.

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); 
    } 
} 
관련 문제