比较和排序arraylist中的对象,java

时间:2016-05-02 18:16:21

标签: java

我有一个由ArrayList个对象组成的Student。这些对象包含名字,姓氏,实验室成绩,项目成绩,考试成绩和总成绩。我正在尝试编写一个函数,根据其总成绩对Student中的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方法吗?

3 个答案:

答案 0 :(得分:4)

ArrayListList,问题是Student未实现Comparable,而您没有定义compareTo方法,我需要使用sort中的Collections方法 你可以做类似的事情:

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)的lambda表达式,您不需要实现Comparable

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

答案 1 :(得分:1)

Collections.sort仅适用于实现Comparable的类型:

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

在这种情况下,使用Comparable<...>实施Student是一个糟糕的选择,因为排序标准可能会发生变化。例如有时您希望按名字排序,有时候也可以按姓氏排序。

List<...>有一个排序方法需要Comparator,你可以使用它:

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

答案 2 :(得分:-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;  
    }