2016-05-02 4 views
2

Studentのオブジェクトで構成されたArrayListがあります。これらのオブジェクトには、名、姓、ラボグレード、プロジェクトグレード、試験グレード、トータルグレードが含まれます。私はStudentオブジェクトを合計グレードに基づいてArrayListにソートする関数を記述しようとしています。arraylistのオブジェクトを比較して注文する、

は、ここに私の学生のクラスです:

public class Student { 

// fields 
private String firstname; 
private String lastname; 
private int labgrade; 
private int projectgrade; 
private int examgrade; 
private int totalgrade; 

// constructor 
public Student(String firstname, String lastname, int labgrade, 
     int projectgrade, int examgrade) { 
    this.firstname = firstname; 
    this.lastname = lastname; 
    this.labgrade = labgrade; 
    this.examgrade = examgrade; 
    this.totalgrade = labgrade + projectgrade + examgrade; 
} 

// method 
public String toString() { 
    String s = firstname + " " + lastname + " has a total grade of " 
      + totalgrade; 
    return s; 
} 
public int compareTo(Student s) { 
    return (totalgrade = s.totalgrade); 
} 

そして、ここで私はソートするために実行しようとしましたものです:

private ArrayList<Student> arraylist = new ArrayList<Student>(); 
public void SortStudent() { 
    Collections.sort(arraylist); 
} 

をしかし、それはそれだけでListないArrayList上で動作することができます言うので、それは動作しません。 。私のSortStudentメソッドを修正する助けがありますか?

+0

'' ArrayList'is List'。 –

+0

あなたの 'compareTo()'が間違っています。 'totalgrade = s.totalgrade'は比較ではなく*割り当て*です。比較するには、 'return Integer.compare(this.totalgrade、s.totalgrade)'を使用します。 – Andreas

答えて

4

ArrayListListで、問題はStudentComparableを実装していない、とあなたはCollectionsからsortメソッドを使用して行う必要がありcompareTo方法を定義していないということです。
あなたは、これに似た何かができる:

public class Student implements Comparable<Student> { 
    //... the rest of the class 
    public int compareTo(Student s) { 
     return Integer.compare(this.grade, s.grade); 
    } 
} 

別のオプションは、あなたが実装する必要はありません方法Collections.sort(List<T>, Comparator<? super T> c)、とラムダ式を使用することですComparable

public void sortStudent() { 
    Collections.sort(arraylist, (s1, s2) -> Integer.compare(s1.grade, s2.grade)); 
} 
+1

'implements comparable' - >' implements comparable ' – saka1029

-1
class Student implements Comparable{ 
      int rollno; 
      String name; 
      int grade; 
    Student(int rollno,String name,int grade){ 
     this.rollno=rollno; 
     this.name=name; 
     this.grade=grade; 
    } 

    public int compareTo(Object obj){ 
     Student st=(Student)obj; 
     if(grade==st.grade) 
     return 0; 
     else if(grade>st.grade) 
     return 1; 
     else 
    return -1; 
    } 
+0

これで 'compareTo'を実装することに感心しましたが、どのように役立ちますか?あなたは何の説明もしていない。 – robotlos

+0

を比較すると、オブジェクトをどのようにコンパイルするかを指定します – suulisin

+2

*インデントなしでは非常に*判読できません。 – Andreas

1

Collections.sortは、Comparableを実装する型に対してのみ機能します。

public static <T extends Comparable<? super T>> void sort(List<T> list) {...} 
Comparable<...>を実装

並べ替え基準は変更する可能性があることから、この場合には悪い選択です。例えば時々あなたはファーストネーム、時には姓でソートしたいと思っています。

List<...>Comparatorを取るsortメソッドを持っている、あなたはそれを使用することができますが:

private ArrayList<Student> arraylist = new ArrayList<Student>(); 
... 
public void SortStudent() { 
    arraylist.sort((x, y) -> Integer.compare(x.totalgrade, y.totalgrade)); 
} 
関連する問題