2016-11-13 79 views
-1

我想添加到這個程序,所以我可以使用Comparable接口比較兩個有理數(這將在稍後的驅動程序類中定義)。但是,當我將public int compareTo作爲參數時,它不允許我聲明多於一個的理性對象。我怎樣才能做到這一點?如何實現Comparable接口來比較2個對象?

public class Rational implements Comparable <Rational, Rational> 
{ 
    private int numerator; 
    private int denominator; 

public Rational (int numer, int denom) 
{ // begins block 
    if (denom == 0) 
    denom = 1; 

if (denom < 0) 
{ 
    numer = numer * -1; 
    denom = denom * -1; 
} 
numerator = numer; 
denominator = denom; 
reduce(); 
} 

public int getNumerator() 
{ 
    return numerator; 
} 
public int getDenominator() 
{ // begins block 
return denominator; 
} 
public Rational reciprocal() 
{ // begins block 
return new Rational (denominator, numerator); 
} 
public Rational add (Rational op2) 
{ // begins block 
int commonDenominator = denominator * op2.getDenominator(); 
int numerator1 = numerator * op2.getDenominator(); 
int numerator2 = op2.getNumerator() * denominator; 
int sum = numerator1 + numerator2; 
return new Rational (sum, commonDenominator); 
} 
public Rational subtract (Rational op2) 
{ // begins block 
int commonDenominator = denominator * op2.getDenominator(); 
int numerator1 = numerator * op2.getDenominator(); 
int numerator2 = op2.getNumerator() * denominator; 
int difference = numerator1 - numerator2; 
return new Rational (difference, commonDenominator); 
} 
public Rational multiply (Rational op2) 
{ // begins block 
int numer = numerator * op2.getNumerator(); 
int denom = denominator * op2.getDenominator(); 
return new Rational (numer, denom); 
} 

public Rational divide (Rational op2) 
{ // begins block 
return multiply (op2.reciprocal()); 
} 
public boolean equals (Rational op2) 
{ // begins block 
return (numerator == op2.getNumerator() && denominator ==  op2.getDenominator()); 
} 
public String toString() 
{ // begins block 
String result; 
if (numerator == 0) 
    result = "0"; 
else 
    if (denominator == 1) 
    result = numerator + ""; 
else 
    result = numerator + "/" + denominator; 
return result; 
} 
private void reduce() 
{ // begins block 
if (numerator != 0) 
{ // begins block 
    int common = gcd 
    (Math.abs(numerator), denominator); 
    numerator = numerator/common; 
    denominator = denominator/common; 
} // ends block 
} 
private int gcd (int num1, int num2) 
{ 
while (num1 != num2) 
    if (num1 > num2) 
    num1 = num1 - num2; 
else 
    num2 = num2 - num1; 
return num1; 
} 

public int compareTo (Rational r1, Rational r2) 
{ 

Float value1 = new Float ((float)r1.getNumerator()/r1.getDenominator()); 
Float value2 = new Float ((float)r2.getNumerator()/r2.getDenominator()); 

int answer = value1.compareTo(value2); 
return answer; 

} 
} 

回答

4

Comparable接口的compareTo方法只需要一個參數:其他實例來比較。 所以它只需要一個類型參數。 要解決的類聲明:

public class Rational implements Comparable<Rational> 

繼當前的compareTo實現, 有一些小的修正和改進的格局, 這裏的落實compareToComparable的一種方式:

@Override 
    public int compareTo(Rational o) { 
    float mine = (float) getNumerator()/getDenominator(); 
    float other = (float) o.getNumerator()/o.getDenominator(); 
    return Float.compare(mine, other); 
    }