2015-11-09 3 views
0

Мне нужно отсортировать массив фракций, вот мой код для класса, который работает нормально.Почему не работает метод сортировки?

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

    public Fraction(int num, int den){ 
     numerator = num; 
     denominator = den; 
    } 

    public int compareTo(Fraction fraction){ 
     if(decimalValue()>fraction.decimalValue()){ 
      return 1; 
     }else if(decimalValue()<fraction.decimalValue()){ 
      return -1; 
     }else{ 
      return 0; 
     } 
    } 
    public Fraction reduce(int numerator, int denominator){ 

    if(numerator==0&&denominator==0){ 
    numerator = 0; 
    denominator = 0; 
    } 
    else{ 
    for(int x = Math.min(Math.abs(numerator), Math.abs(denominator)); x>0; x--){ 
     if(denominator == numerator){ 
      numerator = 1; 
      denominator = 1; 
     } 
     else if(numerator == 0){ 
      numerator = 0; 
      denominator = 1; 
     } 
     else if(numerator%x==0 && denominator%x==0){ 
      numerator = numerator/x; 
      denominator = denominator/x; 
     } 
    } 
    } 

    public double decimalValue(){ 
     double decimal = (numerator*1.0)/(1.0*denominator); 
     return decimal; 
    } 
    public String toString(){ 
     reduce(numerator, denominator); 
     return ((numerator) + "/" + (denominator)); 
    } 
} 

По какой-то причине вид() не работает, если я использовал его с компаратором, как в ответ он работает, но я не понимаю, почему это не работает. Вот тестер:

public class FractionChecker{ 
    public static void main (String[]args){ 
     int n, d; 
     Random rand = new Random(); 
     Fraction[] f = new Fraction [20]; 
     for (int j= 0; j<20; j++){ 
      n = rand.nextInt(20); 
      d = rand.nextInt(19)+1;   
      f[j] = new Fraction (n,d); 
     } 

     System.out.println("Unsorted " + Arrays.toString(f)); 
     Arrays.sort(f); 
    } 
} 

Ошибка:

 ----jGRASP exec: java FractionChecker 
     Unsorted [7/6, 15/14, 5/15, 8/9, 19/16, 16/5, 11/16, 2/9, 11/10, 10/12,  12/11, 9/18, 15/4, 11/4, 10/7, 12/8, 13/14, 19/5, 19/15, 13/5] 
     Exception in thread "main" java.lang.ClassCastException: Fraction cannot be cast to java.lang.Comparable 
     at java.util.Arrays.mergeSort(Arrays.java:1144) 
     at java.util.Arrays.mergeSort(Arrays.java:1155) 
     at java.util.Arrays.mergeSort(Arrays.java:1155) 
     at java.util.Arrays.sort(Arrays.java:1079) 
     at FractionChecker.main(FractionChecker.java:18) 

    ----jGRASP wedge: exit code for process is 1. 
    ----jGRASP: operation complete. 

This is the error I am getting when I use Arrays.sort(f) and I am not sure why. 
+2

Я думаю, что вы ищете 'Arrays.sort' вместо' Collections.sort' - Коллекции для списков и других коллекций. 'f' - массив. –

+3

'f' - массив, поэтому вам нужно использовать' Arrays.sort() '. Также 'sort()' не имеет возвращаемого значения, поэтому вы не можете его распечатать. – Andreas

+0

Я изменил его, чтобы сортировать, но теперь он говорит java.lang.ClassCastException: Фракция не может быть отброшена в java.lang.Comparable – Sarah

ответ

1

Collections.sort ожидает List, чей тип реализует сравнимые. Вместо этого вы предоставляете массив объектов фракции.

Вы должны использовать Arrays.sort вместо:

Arrays.sort(f); 

Если выше бросает ClassCastException по какой-то причине, вы можете попробовать эту версию Arrays.sort, что требует Comparator в качестве аргумента, что будет делать сравнение:

Arrays.sort(f, new java.util.Comparator<Fraction>() { 
    @Override 
    public int compare(Fraction f1, Fraction f2) { 
     return f1.compareTo(f2); 
    } 
}); 
0

Я не вижу свой decimalValue код. Лучший способ сравнить дроби в любом случае может быть:

long left = numerator * other.denominator; 
long right = other.numerator * denominator; 

if (left == right) { 
    return 0; 
} else if (left < right) { 
    return -1; 
} else /* if (left > right) */ { 
    return 1; 
} 

Не то, что это повысит производительность резко, но это просто аккуратнее и обрабатывает деление на ноль в разумный путь.

+0

К сожалению, я не могу комментировать другие сообщения, но это неправильно. 'Arrays.sort()' не нуждается в компараторе, он может использовать естественный порядок, если передан только один аргумент. – rudolfovic

+0

Вы правы. Я пропустил это в джавадоке. – TNT

+0

Я изменил это теперь, когда говорит java.lang.ClassCastException: Фракция не может быть отброшена в java.lang.Comparable. Вы знаете, почему это – Sarah

0

код ниже работ и гравюр success

import java.util.Arrays; 

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

    public Fraction(int num, int den){ 
     numerator = num; 
     denominator = den; 
    } 

    public int compareTo(Fraction fraction){ 
     if(decimalValue()>fraction.decimalValue()){ 
      return 1; 
     }else if(decimalValue()<fraction.decimalValue()){ 
      return -1; 
     }else{ 
      return 0; 
     } 
    } 

    public double decimalValue(){ 
     double decimal = (numerator*1.0)/(1.0*denominator); 
     return decimal; 
    } 
    public String toString(){ 
     return ((numerator) + "/" + (denominator)); 
    } 

    public static void main(String[] a) { 
     Fraction[] fractions = new Fraction[2]; 
     fractions[0] = new Fraction(1,1); 
     fractions[1] = new Fraction(2,3); 
     Arrays.sort(fractions); 
     System.out.println("success"); 
    } 
} 
Смежные вопросы