Портирование компаратора с C # на Java - PullRequest
1 голос
/ 14 апреля 2009

Я пытаюсь преобразовать эти маленькие математические вызовы в Java из C # и просто хотел убедиться, что они работают одинаково. Я добавил еще один вызов, так как он не поддерживается в 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));
}

А вот еще один пример репликации C # 'next' с двумя параметрами int в Java:

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 ]

2 голосов
/ 14 апреля 2009

Почему бы просто не использовать сравнение Java? Предполагается, что 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 голос
/ 14 апреля 2009

Нет, потому что Math.Sign в C # возвращает одно из трех значений: -1, если значение <0, 0, если значение равно 0, и 1, если значение больше 0. Это не переворачивает знак умножением на -1, как вы делаете в коде Java. </p>

В C # функция CompareTo ожидает, что -1 означает, что объект, для которого она вызывается, меньше передаваемого объекта. Так как вы возвращаете знак вычитания значения 1 из значения 2, это будет переключено. Я сомневаюсь, что это то, что вы хотите для вашего алгоритма, учитывая ваш код Java. Традиционно вы должны вычесть значение 2 из значения 1 и использовать этот знак.

0 голосов
/ 19 мая 2009

Я бы написал что-то вроде.

Примечание. Вы должны быть очень осторожны при использовании 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);
    }
}
0 голосов
/ 14 апреля 2009

Если в вашей версии Java EquationGenome реализован интерфейс Comparable, вы сможете воспользоваться многими API Java . Это изменит ваш класс так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...