Java线性表的排序
前言:刚才在弄JDBC的时候,忽然觉得order-by用太多了没新鲜感,我的第六感告诉我java有对线性表排序的封装,然后在eclipse里随便按了一下“.” ,哈哈,竟然真有这么一个静态方法public static void sort(List list, Comparator super T> c)。
修改记录:根据@mythabc的的建议,添加了另一种方式。
方式一:Comparator比较器
好处:这种方式运行的时候比较灵活,如果要更换排序规则,不更改原有的比较器,而直接新建另一个比较器,在客户端换一下比较器的新类名就行了,这样比较贴近开闭原则,当累积了多个比较器后,各种排序规则可以随意转换,挺爽的;模型与排序分离,比较贴近单一职责原则。
1.先定义一个模型:
packagemodel;
public classUser
{privateString userName;private intuserAge;publicUser()
{
}public User(String userName, intuserAge)
{this.userName =userName;this.userAge =userAge;
}publicString getUserName()
{returnuserName;
}public voidsetUserName(String userName)
{this.userName =userName;
}public intgetUserAge()
{returnuserAge;
}public void setUserAge(intuserAge)
{this.userAge =userAge;
}
}
2.然后定义一个比较器,实现java.util.Comparator接口,在compare()方法编写比较规则:
packageutil;importjava.util.Comparator;importmodel.User;
public class ComparatorUser implements Comparator{
@Overridepublic intcompare(User arg0, User arg1)
{//先比较名字
int flag =arg0.getUserName().compareTo(arg1.getUserName());//如果名字一样,就比较年龄
if (flag == 0)
{return arg0.getUserAge() -arg1.getUserAge();
}returnflag;
}
}
3.排序的时候用java.util.Collections里面的sort(List list, Comparator c)方法:
packagetest;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importutil.ComparatorUser;importmodel.User;
public classTestApp
{public static voidmain(String[] arg0)
{
List userList = new ArrayList();//插入数据
userList.add(new User("A", 15));
userList.add(new User("B", 14));
userList.add(new User("A", 14));//排序
Collections.sort(userList, newComparatorUser());//打印结果
for(User u : userList)
{
System.out.println(u.getUserName()+ " " +u.getUserAge());
}
}
}
4.运行结果:
A 14A15B14
方式二:实现Comparable接口
好处:直接让模型附带可排序的属性,不用去定义新的类(不用定义比较器),减少了类的数量,方便管理,阅读的时候比较轻松。
1.先定义一个模型,并实现Comparable接口,在compareTo()方法编写比较规则:
packagemodel;
public class Student implements Comparable{privateString studentName;private intstudentAge;publicStudent()
{
}public Student(String studentName, intstudentAge)
{this.studentName =studentName;this.studentAge =studentAge;
}publicString getStudentName()
{returnstudentName;
}public voidsetStudentName(String studentName)
{this.studentName =studentName;
}public intgetStudentAge()
{returnstudentAge;
}public void setStudentAge(intstudentAge)
{this.studentAge =studentAge;
}
@Overridepublic intcompareTo(Student o)
{//先比较名字
int flag = this.getStudentName().compareTo(o.getStudentName());//如果名字一样,就比较年龄
if (flag == 0)
{return this.getStudentAge() -o.getStudentAge();
}returnflag;
}
}
2.排序的时候用java.util.Collections里面的sort(List list)方法:
packagetest;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importmodel.Student;
public classTestApp2
{public static voidmain(String[] arg0)
{
List studentList = new ArrayList();//插入数据
studentList.add(new Student("A", 15));
studentList.add(new Student("B", 14));
studentList.add(new Student("A", 14));//排序
Collections.sort(studentList);//打印结果
for(Student s : studentList)
{
System.out.println(s.getStudentName()+ " " +s.getStudentAge());
}
}
}
3.运行结果:
A 14A15B14