2016-02-26 2 views
1

Я очень застревают на проекте, до сих пор я получил:Сопоставимые интерфейс проекта

public class MyInt implements Comparable<MyInt> { 
    private int value; 

    MyInt(int x) { 
     value = x; 
    } 

    public String toString() { 
     return ("" + value); 
    } 

    public int intValue() { 
     return value; 
    } 

    public int compareTo(MyInt rhs) { 
     MyInt myInt = (MyInt) rhs; 
     int myInteger = myInt.intValue(); 
     int result = 0; 
     if (value < myInteger) { 
      result = -1; 
     } else if (value == myInteger) { 
      result = 0; 
     } else { 
      result = +1; 
     } 
     return result; 

    } 
} 

И это вопрос: Рассмотрим следующий интерфейс Java библиотеки:

public interface Comparable<T> { 
int compareTo(T rhs); 
} 

Complete реализация нижеприведенного класса реализует вышеуказанный интерфейс (обратите внимание, что этот интерфейс автоматически импортируется java - НЕ повторно введите его в свой проект). Метод compareTo должен возвращать -1, если значение меньше значения rh.value, 0, если обе стороны равны и +1, если значение больше, чем значение rh.value. ?

public class MyInt implements Comparable<MyInt> { 
private int value; 
MyInt(int x) {...} 
public String toString() {...} 
public int intValue() {...} 
public int compareTo(MyInt rhs){...} 
} 

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

public class Rational { 
    private int num; 
    private int denom; 

    public Rational() { 
     this(0,1); 
    } 

    public Rational(int num, int denom) { 
     this.num = num; 
     this.denom = denom; 
    } 

    int getNum() { 
     return num; 
    } 

    int getDenom() { 
     return denom; 
    } 

    public Rational add(Rational rhs) { 
     return new Rational(num * rhs.denom + rhs.num * denom, denom * rhs.denom); 
    } 

    public Rational subtract(Rational rhs) { 
     return new Rational(num * rhs.denom - rhs.num * denom, denom * rhs.denom); 
    } 

    public Rational multiply(Rational rhs) { 
     return new Rational(num * rhs.num, denom * rhs.denom); 
    } 
public Rational divide(Rational rhs) { 
    return new Rational(num * rhs.denom, denom * rhs.num); 
} 

public String toString() { 
    String result; 

    if (num == 0) 
     result = "0"; 
    else if (denom == 1) 
     result = num + ""; 
    else 
     result = num + "/" + denom; 

    return result; 
} 

public static void main(String[] args) { 
    Rational r1 = new Rational(1, 2); // 1/2 
    Rational r2 = new Rational(3, 4);// 3/4 
    Rational result = new Rational(); 
    result = r1.add(r2); 
    System.out.println(result); 

    Rational result1 = new Rational(); 
    result1 = r1.subtract(r2); 
    System.out.println(result1); 

    Rational result2 = new Rational(); 
    result2 = r1.multiply(r2); 
    System.out.println(result2); 

    Rational result3 = new Rational(); 
    result3 = r1.divide(r2); 
    System.out.println(result3); 

} 

}

+1

Ух ... Да, вам нужно сравнить значения и вернуть -1, 0 или 1, как вы сказали. Что именно вы не понимаете, что вам нужно делать? – azurefrog

+0

Сначала вам нужно спросить себя: 1) получить экземпляр 'MyInt'« rhs », как мне получить числовое значение (int)? 2) как получить одно и то же 'значение' изнутри экземпляра (в методе' MyInt') 3) как мне сравнить 'int'? – pyb

+0

В качестве побочного примечания: я вижу, что это часть вашей спецификации, чтобы явно возвращать 0, -1 или 1; при нормальных обстоятельствах при работе с объектами 'Comparable ' не принимайте само собой разумеющееся число будет равно 1 или -1. Контракт требует только, чтобы * некоторое * отрицательное или положительное целое значение, или ноль, будет возвращено. Итак, ваши проверки должны быть '<', '>' или '==' до 0. – ChiefTwoPencils

ответ

1

Вам нужно сравнить this.intValue() (текущий экземпляр) и rhs.intValue() («правая сторона»). Сравнение rhs с самим собой (путем наложения его на myInt) должно всегда возвращать 0. И сохранение результата в качестве временной переменной, похоже, не имеет какой-либо цели в вашем коде. Вы могли бы сделать что-то вроде

// MyInt myInt = (MyInt) rhs; 
if (this.intValue() < rhs.intValue()) { 
    return -1; 
} else if (this.intValue() == rhs.intValue()) { 
    return 0; 
} 
return 1; 
+1

@ChiefTwoPencils Вы пропустили один из требований OP, метод * compareTo должен возвращать -1, если значение меньше, чем rh.value, 0, если обе стороны равны и +1, если значение больше, чем значение rh.value. * –

0

Нет необходимости делать явное приведение вашего параметра (MyInt РИТ), и так как вы просто сравнивая два целых числа, используйте статический сравнить метод из Integer:

public int compareTo(MyInt rhs) { 
    return Integer.compare(this.value, rhs.intValue()); 
} 

I предложит изменить ваше поле int на Integer, чтобы избежать потери производительности при автобоксинге примитивов

Смежные вопросы