在编程中时不时需要进行排序,在java中有内置的函数可以简便高效地进行排序,这就是Collections.sort方法。这个方法有两个重载版本,一个是只有一个参数的List<T>,此时要求这个列表的所有对象都是可以比较的。也就是说需要实现Comparable接口,同时实现接口下的compareTo函数。另一个sort方法有两个参数:List<T>和Comparator<? super T>。此时不要求List中的对象实现Comparable接口,但是却要求传人另一个比较对象,这个对象必须实现Comparator接口,同时实现接口下的compare函数。
下面是一个运用两种排序方法的小程序
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Student implements Comparable<Student>
{
private String name;
private int id;
private int score;
public Student()
{
// empty
}
public Student(String name, int id, int score)
{
this.name = name;
this.id = id;
this.score = score;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public int getScore()
{
return score;
}
public void setScore(int score)
{
this.score = score;
}
@Override
public String toString()
{
return "Student [name=" + name + ", id=" + id + ", score=" + score + "]";
}
@Override
public int compareTo(Student o)
{
/*
* 如果当前对象小于另一个对象,则返回负数
* 如果当前对象大于另一个对象,则返回正数
* 如果当前对象等于(比较意义上的等于)另一个对象,则返回0
*/
if (id < o.getId())
return -1;
if (id > o.getId())
return 1;
return 0;
}
}
class SortStudentByScore implements Comparator<Student>
{
@Override
public int compare(Student o1, Student o2)
{
/*
* 如果第一个对象小于第二个对象,则返回负数
* 如果第一个对象大于第二个对象,则返回正数
* 如果第一个对象等于(比较意义上的等于)第二个对象,则返回0
*/
if (o1.getScore() < o2.getScore())
return -1;
if (o1.getScore() > o2.getScore())
return 1;
return 0;
}
}
class Teacher
{
private String name;
private int id;
public Teacher()
{
// empty
}
public Teacher(String name, int id)
{
super();
this.name = name;
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
@Override
public String toString()
{
return "Teacher [name=" + name + ", id=" + id + "]";
}
}
class SortTeacherById implements Comparator<Teacher>
{
@Override
public int compare(Teacher o1, Teacher o2)
{
return o1.getId() - o2.getId();
}
}
public class Test
{
private ArrayList<Student> students = new ArrayList<Student>();
private ArrayList<Teacher> teachers = new ArrayList<Teacher>();
private void getStudents()
{
Student stu1 = new Student("Tom", 1, 70);
Student stu2 = new Student("Amy", 3, 60);
Student stu3 = new Student("Sunny", 2, 100);
Student stu4 = new Student("Tony", 4, 80);
students.add(stu1);
students.add(stu2);
students.add(stu3);
students.add(stu4);
}
private void getTeachers()
{
Teacher t1 = new Teacher("Li", 1);
Teacher t2 = new Teacher("Wang", 4);
Teacher t3 = new Teacher("Zhang", 2);
Teacher t4 = new Teacher("Zhao", 3);
teachers.add(t1);
teachers.add(t2);
teachers.add(t3);
teachers.add(t4);
}
private void printStudents()
{
for (Student stu : students)
System.out.println(stu);
}
private void printTeachers()
{
for (Teacher t : teachers)
System.out.println(t);
}
private void testSort()
{
getStudents();
System.out.println("-----Student Class implements Comparable------");
System.out.println("-----------init, before sort------------");
printStudents();
Collections.sort(students);
System.out.println("-------after sort by Comparable, sort by id-------");
printStudents();
Collections.sort(students, new SortStudentByScore());
System.out.println("-------after sort by Comparator, sort by score-----");
printStudents();
System.out.println();
getTeachers();
System.out.println("-----Teacher Class not implements Comparable------");
System.out.println("-----------init, before sort------------");
printTeachers();
Collections.sort(teachers, new SortTeacherById());
System.out.println("-----------after sort by Comparator-------------");
printTeachers();
}
public static void main(String[] argv)
{
Test test = new Test();
test.testSort();
}
}
程序运行结果如下图