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){ List list=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){ List list=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程序设计有所帮助。