Java针对ArrayList自定义排序的2种实现方法
本文实例讲述了Java针对ArrayList自定义排序的2种实现方法。分享给大家供大家参考,具体如下:
Java中实现对list的自定义排序主要通过两种方式
1)让需要进行排序的对象的类实现Comparable接口,重写compareTo(To)方法,在其中定义排序规则,那么就可以直接调用Collections.sort()来排序对象数组
publicclassStudentimplementsComparable{
privateintid;
privateintage;
privateintheight;
privateStringname;
publicStudent(intid,Stringname,intage,intheight){
this.id=id;
this.name=name;
this.age=age;
this.height=height;
}
publicintgetId(){
returnid;
}
publicintgetAge(){
returnage;
}
publicintgetHeight(){
returnheight;
}
publicStringgetName(){
returnname;
}
publicvoidsetId(intid){
this.id=id;
}
publicvoidsetAge(intage){
this.age=age;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicvoidsetHeight(intheight){
this.height=height;
}
@Override
publicintcompareTo(Objecto){
Students=(Student)o;
if(this.age>s.age){
return1;
}
elseif(this.age=s.height){
return1;
}
else{
return-1;
}
}
}
}
测试类:
importjava.util.*;
publicclassTest{
publicstaticvoidprintData(Listlist){
for(Studentstudent:list){
System.out.println("学号:"+student.getId()+"姓名:"+student.getName()+"年龄"+student.getAge()+"身高:"+student.getHeight());
}
}
publicstaticvoidmain(String[]args){
Listlist=newArrayList<>();
list.add(newStudent(1,"A",20,180));
list.add(newStudent(2,"B",21,175));
list.add(newStudent(3,"C",22,190));
list.add(newStudent(4,"D",21,170));
list.add(newStudent(5,"E",20,185));
System.out.println("beforesorted");
printData(list);
Collections.sort(list);
System.out.println("afterageandheightsorted");
printData(list);
}
}
结果:
beforesorted 学号:1姓名:A年龄20身高:180 学号:2姓名:B年龄21身高:175 学号:3姓名:C年龄22身高:190 学号:4姓名:D年龄21身高:170 学号:5姓名:E年龄20身高:185 afterageandheightsorted 学号:1姓名:A年龄20身高:180 学号:5姓名:E年龄20身高:185 学号:4姓名:D年龄21身高:170 学号:2姓名:B年龄21身高:175 学号:3姓名:C年龄22身高:190
2)实现比较器接口Comparator,重写compare方法,直接当做参数传进sort中
publicclassStudent{
privateintid;
privateintage;
privateintheight;
privateStringname;
publicStudent(intid,Stringname,intage,intheight){
this.id=id;
this.name=name;
this.age=age;
this.height=height;
}
publicintgetId(){
returnid;
}
publicintgetAge(){
returnage;
}
publicintgetHeight(){
returnheight;
}
publicStringgetName(){
returnname;
}
publicvoidsetId(intid){
this.id=id;
}
publicvoidsetAge(intage){
this.age=age;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicvoidsetHeight(intheight){
this.height=height;
}
}
测试类:
importjava.util.*;
publicclassTest{
publicstaticvoidprintData(Listlist){
for(Studentstudent:list){
System.out.println("学号:"+student.getId()+"姓名:"+student.getName()+"年龄"+student.getAge()+"身高:"+student.getHeight());
}
}
publicstaticvoidmain(String[]args){
Listlist=newArrayList<>();
list.add(newStudent(1,"A",20,180));
list.add(newStudent(2,"B",21,175));
list.add(newStudent(3,"C",22,190));
list.add(newStudent(4,"D",21,170));
list.add(newStudent(5,"E",20,185));
System.out.println("beforesorted");
printData(list);
Collections.sort(list,newComparator(){
@Override
publicintcompare(Studento1,Studento2){
if(o1.getAge()>=o2.getAge()){
return1;
}
else{
return-1;
}
}
});
System.out.println("afteragesorted");
printData(list);
Collections.sort(list,newComparator(){
@Override
publicintcompare(Studento1,Studento2){
if(o1.getAge()>o2.getAge()){
return1;
}
elseif(o1.getAge()=o2.getHeight()){
return1;
}
else{
return-1;
}
}
}
});
System.out.println("afterageandheightsorted");
printData(list);
}
}
输出结果:
beforesorted 学号:1姓名:A年龄20身高:180 学号:2姓名:B年龄21身高:175 学号:3姓名:C年龄22身高:190 学号:4姓名:D年龄21身高:170 学号:5姓名:E年龄20身高:185 afteragesorted 学号:1姓名:A年龄20身高:180 学号:5姓名:E年龄20身高:185 学号:2姓名:B年龄21身高:175 学号:4姓名:D年龄21身高:170 学号:3姓名:C年龄22身高:190 afterageandheightsorted 学号:1姓名:A年龄20身高:180 学号:5姓名:E年龄20身高:185 学号:4姓名:D年龄21身高:170 学号:2姓名:B年龄21身高:175 学号:3姓名:C年龄22身高:190
单从上面的例子可以看出排序是稳定的,去看了下java的Collections.sort的源代码,确实是基于稳定的归并排序实现的,内部还做了优化,叫TimSort。(关于TimSort还可参考https://baike.baidu.com/item/TimSort?fr=aladdin)
PS:这里再为大家推荐一款关于排序的演示工具供大家参考:
在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具:
http://tools.jb51.net/aideddesign/paixu_ys
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。