2016-12-18 1 views
0

パブリッククラス画分の配列をソートすることができるどのよう{Iタイプの画分(INTのN、INT d)は

private int num, den; 
static double ratio; 

public Fraction() { 
    super(); 
    num = 1; 
    den = 1; 

    // TODO Auto-generated constructor stub 
} 

public Fraction(int num, int den) { 
    super(); 
    this.num = num; 
    this.den = den; 

} 

public int getNum() { 
    return num; 
} 

public int getDen() { 
    return den; 
} 

public double getRatio() { 
    return ratio; 
} 

public void setNum(int num) { 
    this.num = num; 
} 

public void setDen(int den) { 
    this.den = den; 
} 

public void setRatio(double ratio) { 
    Fraction.ratio = ratio; 
} 

public Fraction add(Fraction second) 
{ 
    Fraction third = new Fraction(); 
    third.num = this.num * second.den + this.den * second.num; 
    third.den = this.den * second.den; 
    return third; 
} 

public double findratio(double n, double d) 
{ 
    ratio = 0; 

    ratio = n/d; 

    return ratio; 
} 

public int findGCD (int n, int d) 
{ 
    int gcd = 0, temp = 0; 

    while (n != 0 && d != 0) 
    { 
     temp = n; 
     n = d % n; 
     d = temp; 
    } 

    gcd = n + d; 
    return gcd; 
} 

public void reduce() 
{ 
    int gcd = findGCD(num, den); 
    { 
     this.num /= gcd; 
     this.den /= gcd; 
    } 
} 

@Override 
public String toString() 
{ 
    return num + "/" + den; 
} 

}

インポートjava.utilの*。

パブリッククラスtestFraction {

private static Fraction frac; 
Fraction[] fracs = new Fraction[8]; 

public static void fillArray() 
{ 
    Scanner z = new Scanner(System.in); 
    Scanner k = new Scanner(System.in); 
    Fraction[] fracs = new Fraction[8]; 


    for(int i = 0; i < fracs.length - 1; i++) 
    { 
     Fraction addt = new Fraction(); 
     Fraction f = new Fraction(); 
     fracs[i] = f; 
     testFraction.frac = f; 
     f.setNum(z.nextInt()); 
     f.setDen(k.nextInt()); 

     addt = f.add(fracs[i]); 


    } 
     System.out.println(frac); 
     Arrays.sort(fracs); 
     System.out.println(Arrays.toString(fracs)); 

    z.close(); 
    k.close(); 

} 




public static void main(String[] args) { 

    fillArray(); 



} 

}

は私がGCD、さらに、画分の削減を定義する分数クラスを持っている、しかし、私はの配列と、これらのメソッドを使用しようとして立ち往生しています分数。さらに、私はこの配列を最小から最大まで並べ替える必要があります。最小から最大のものを削除し、残りを一緒に追加して減らしてください。

誰にでも正しい軌道に乗るためのヒントがありますか?

+0

浮動小数点(つまり浮動小数点)表現を使用して比較します。 –

+0

すべての分母が正であると仮定すると、 'a/b'と' c/d'を 'ad'と' bc'(両辺に 'bd'を乗じて比較する)を比較することによって比較することができます。コンパレータの書き込み方法とソート方法については、http://stackoverflow.com/documentation/java/3137/comparable-and-comparator/10693/sorting-a-list-using-comparablet-or-aを参照してください。 -comparatort#t = 201612180346068842778。 – ajb

答えて

2

基本的に、これはComparator<Fraction>またはComparable<Fraction>インターフェイスごとにcompareまたはcompareToメソッドを実装することになっています。 2つのFractionオブジェクトの比を比較

比が正しく計算されていると仮定...賢明な順序付けを実装する方法であろう。 Fraction(1, 2)Fraction(2, 4)を等しく扱う場合は、比率が同じ場合には、「タイ・ブレーカー」としてnumの値を使用することができます。 FractionComparable<Fraction>実装したり、別のComparator<Fraction>クラス/インスタンスを実装した後は

、その後、Arrays.sort(Fraction[])への呼び出しが動作します。


現在コードで比率を扱っている方法に問題があります。確かに、それはstaticフィールドであってはならないので、設定することはできません。確かに、それはから導き出されたの情報であり、numdenフィールドから(唯一/常に)計算されるべきです。実際

Fractionfinalフィールドなしsetterメソッドで、不変なるように設計されたならば、それは全体的に良いだろう。


num 1.及びdendoubleとしてintratioあり、十分な精度で比を表すのに十分な精度があるべきです。代わりにnumおよびdenlongである場合、ratioは、すべての場合に発注に十分な精度がありません。

関連する問題