About "sort of the objects"
????? 今天完成了一个小工程,这个工程的功能是对学生进行管理,可以添加,删除,修改成绩,使学生按不同规则进行排序(我所实现的是按照studentName 和 averageScore进行排序)。
?
????? 以前所能做到的只是对例如int,double等的基本数据类型进行比较,排序。现在可以利用对类实现Comparable<T>接口来达到对对象的比较排序的目的,其中,T
表示可以与此对象进行比较的那些对象的类型。一个很典型的例子就是String这个类,String实现了Comparable<String>这个接口,并对其唯一的抽象方法:compareTo()进行重写,使两个String可以比较,排序。
?
????? 现如今,我们将此构架移植到Student这个工程中,实现排序功能。
?
----------------------------------------------------------
?
代码如下:
?
第一个类:
?
public class Student implements Comparable<Student>{ private String studentNumber; private String studentName; private int markForMaths; private int markForEnglish; private int markForScience; private double averageScore; private static int sortType; public Student(String number,String name) { studentNumber=number; studentName=name; } public String getNumber() { return studentNumber; } public String getName() { return studentName; } public void enterMarks(int maths,int english,int science) { markForMaths=maths; markForEnglish=english; markForScience=science; calculateAverageMark(); } public int getMathsMark() { return markForMaths; } public int getEnglishMark() { return markForEnglish; } public int getScienceMark() { return markForScience; } public double calculateAverageMark() { averageScore=(markForMaths+markForEnglish+markForScience)/3.0; return averageScore; } public String toString() { String showMessage="StudentNumber is:"+getNumber()+"\n"+"StudentName is:"+getName()+"\n"; showMessage+="AverageMark is"+calculateAverageMark()+"\n"; showMessage+="-------------------------------------"; return showMessage; } public static void setSortType(int number) { sortType=number; } public int compareTo(Student stu) { if(sortType==1)// sort by the average mark { if(calculateAverageMark()>stu.calculateAverageMark()) { return -1; } else if(calculateAverageMark()<stu.calculateAverageMark()) { return 1; } else return 0; } else if(sortType==2)// sort byt the name index { int num =getName().compareTo(stu.getName()); if(num>0) { return 1; } else if (num<0) { return -1; } else return 0; } return 0; }}
?
?
compareTo()这个方法中,就是对比较规则进行规定(specify the rules of sort),由于这个方法是重写的,所以方法必定有参数(接口Comparable中的compareTo(T o)就有参数,根据overriding,此类的compareTo()也必须有参数)。
?
如果想实现各种各样的不同规则的排序,就需要定义一个类变量sortType来指定排序的类型,此例中:1.表示按照学生的平均成绩进行排序? 2.表示按学生的名字进行排序。
?
第二个类:
?
import java.util.*;public class StudentManager{ private ArrayList<Student> stu; public StudentManager() { stu=new ArrayList<Student>(); } public void addStudent(String name) { int numberOfStudent=stu.size()+1; String number="J-BCU"; if(numberOfStudent<10) { number=number+"00"+numberOfStudent; } else if(numberOfStudent>10) { number=number+"0"+numberOfStudent; } Student t= new Student(number,name); stu.add(t); } public void removeStudent(String number) { Student removeOne =findStudent(number); if(removeOne!=null) { stu.remove(removeOne); } } public Student findStudent(String number) { for(Student student:stu) { if((student.getNumber()).equals(number)) { return student; } } return null; } public void showAllStudent() { for(Student student:stu) { System.out.println(student); } } public void inputMark(String number,int math,int enl,int sci) { Student inputOne= findStudent(number); if(inputOne !=null) { inputOne.enterMarks(math,enl,sci); } } public void sortByAverage() { int sortAverage=1;//1 means the sort type is sorted by the average mark of student. Student.setSortType(sortAverage); Collections.sort(stu); } public void sortByName() { int sortName=2;//2 means the sort tyoe is sorted by the name index. Student.setSortType(sortName); Collections.sort(stu); }}
?
?
这个通过利用ArrayList来对学生进行管理,在sortByAverage()和sortByName()两个方法中,通过对Student的静态方法setSortType(sortAverage)的调用改变排序类型,然后利用java.util.Collections中
?
public static <T extends Comparable<? super T>> void sort(List<T>?list)
?
的调用,在此例中:是Collections.sort(stu);
注意:
???????????????? 1)列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。
?
?????????????????2)指定列表必须是可修改的,但不必是大小可调整的。
?
----------------------------------------------------------
?
通过以上操作,即对对象进行了排序。
?
如果是对象们存放在array中,用类Arrays 的 sort方法。
如果是对象们存放在list中,??? 用Collections的 sort方法。
?
?
?