Метод переопределения равно для сравнения двух дробей - PullRequest
0 голосов
/ 01 февраля 2020

В настоящее время я работаю над проектом, в котором мне нужно сравнить две фракции. Я не делал такого раньше, переопределяя метод, поэтому мне нужна небольшая помощь.

Вот то, что беспокоит меня;

Итак, у меня есть класс, называемый Fraction, и в этом классе у меня есть два поля.

public class Fraction {

private int denominator;
private int numerator;

public Fraction(int numerator, int denominator) {

    //Throwing an error if the denominator is 0.
    if (denominator == 0) {
        throw new IllegalArgumentException("Denominator cannot be zero!");
    }
    //When both numbers are negative
    if (denominator < 0 && numerator < 0) {
        denominator *= -1;
        numerator *= -1;
    }
    //When the numerator is negative
    if (denominator < 0 && numerator > 0) {
        denominator *= -1;
        numerator *= -1;
    }

    this.denominator = denominator;
    this.numerator = numerator;
}

public Fraction(int numerator) {
    this.numerator = numerator;
    this.denominator = 1;
}

public Fraction() {
    this.numerator = 0;
    this.denominator = 1;
}

У меня также есть пара других полезных методов для сравнения двух фракций, подобных этой:

//converts the current fraction to the lowest terms
public void toLowestTerms() {
    int reminder = 0, gcd = 0;
    int up = numerator, bottom = denominator;

    while (up != 0 && bottom != 0) {
        reminder = up % bottom;
        up = bottom;
        bottom = reminder;
        gcd = up;
    }
    numerator /= gcd;
    denominator /= gcd;
}

Итак, вот часть, в которой я застрял.

@Override
//must take in an "Object" to properly override the Object class's equals method, but should ultimately check if two fractions are equal
public boolean equals(Object obj) {

    // If the object is compared with itself then return true
    if(obj == this){
        return true;
    }

    /* check if o is an instance of Complex or not
      "null instanceof [type]" also returns false */
    if (!(obj instanceof Fraction)) {
        return false;
    }

    //This object is created for
    Fraction compareObject = new Fraction(this.getNumerator(), this.getDenominator());
    compareObject.toLowestTerms();

    // typecast o to Fraction so that we can compare data members
    Fraction x = (Fraction) obj;

    //converting to the lowest terms to compare
    ((Fraction) obj).toLowestTerms();

    // Compare the data members and return accordingly
    return (compareObject.getNumerator()== x.getNumerator() && compareObject.getDenominator() == x.getDenominator());
}

Это правильно, или есть способ сделать это правильно? Технически я создаю объект, чтобы использовать метод toLowestTerms. Потому что, когда я хочу сравнить, например, 1/2 == 12/24, мне нужно уменьшить числитель и знаменатель, чтобы сделать хорошую проверку.

'Fraction compareObject = new Fraction(this.getNumerator(), this.getDenominator());
compareObject.toLowestTerms();`  

1 Ответ

1 голос
/ 01 февраля 2020

Ваш код мне кажется хорошим, я думаю, он будет работать. Я бы добавил несколько моментов, в основном о ваших комментариях:

1.

Если объект сравнивается с самим собой, тогда верните true

Если объект идентичен (то есть тот же экземпляр)

2.

экземпляр Complex

Вы имеете в виду instance of Fraction?

3. Кажется, ваш метод toLowestTerms изменяет текущий экземпляр this. По этой причине вы создали новый экземпляр для представления this, названный compareObject, я могу только предположить, что вы не измените this, когда вызывается сравнение (хорошо!). Но для параметра obj вы изменяете экземпляр! Вы не сделали копию. Вы также можете просто решить эту проблему, создав копию, но могу ли я предложить, чтобы ваш метод toLowestTerms возвращал новую копию Fraction с наименьшими условиями? Затем вы можете безопасно позвонить по обоим this и obj, получить бесплатные sh новые копии и сравнить оба.

4. Еще более глубокое дизайнерское решение - принудительно вызвать toLowestTerms для конструктора / сеттера. Так что невозможно иметь Fraction, который не на самых низких условиях. Это значительно упростило бы методы типа equals, hashCode. Но это более глубокое дизайнерское решение, которое вам необходимо принять. Если вы это сделаете, вы можете взглянуть на библиотеку под названием Lombok, которая сгенерирует вам equals и hashCode на основе свойств класса! Но не буду делать дальнейшие вычисления, как toLowestTerms.

5. Если вы реализуете equals, возможно, вы захотите также реализовать hashCode и убедиться, что они совместимы.

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