首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

About "sort of the objects"

2012-12-18 
About sort of the objects????? 今天完成了一个小工程,这个工程的功能是对学生进行管理,可以添加,删除,

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 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。

?

?????????????????2)指定列表必须是可修改的,但不必是大小可调整的。

?

----------------------------------------------------------

?

通过以上操作,即对对象进行了排序。

?

如果是对象们存放在array中,用类Arrays 的 sort方法。

如果是对象们存放在list中,??? 用Collections的 sort方法。

?

?

?

热点排行