2016-12-18 1 views
0

Public 클래스 분획 배열을 정렬 할 수있는 방법 {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

모든 분모가 양수라고 가정하면 '광고'와 'bc'를 비교하여 'a/b'와 'c/d'를 비교할 수 있습니다 (양면에 '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. 및 dendoubleintratio이며, 충분한 정밀도의 비율을 나타내는 충분한 정밀도가 있어야한다. 대신 numdenlong 인 경우 ratio은 모든 경우에 주문이 작동하기에 충분한 정밀도가 없습니다.