博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转载)java list排序
阅读量:6441 次
发布时间:2019-06-23

本文共 5947 字,大约阅读时间需要 19 分钟。

1、简介                                

这个和数组的排序又不一样了。

其实Java针对数组和List的排序都有实现,对数组而言,你可以直接使用Arrays.sort对于List和Vector而言,你可以使用Collections.sort方法

Java API针对集合类型的排序提供了2个方法:

java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.util.List, java.util.Comparator)

如果集合里面的元素都是相同类型的,并且实现了Comparable接口,那么可以直接调用第一个方法。

如果你有其它的排序的想法,比如你不想按照自然排序进行,还可以传一个Comparator过去,比如反向。

元素不相同的情况比较复杂,可以暂时不用考虑。

 

2、通过实现Comparable接口来实现list的排序    

假如现在我们有一个Person类的list集合,要让其按照一个Order属性进行排序,我们可以让Person类实现Comparable接口,重写其CompareTo方法即可。具体实现如下:

1)、Person实体类

public class Person implements Comparable
{ private String name; private Integer order; /** * @return the name */ public String getName() { return name; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } /** * @return the order */ public Integer getOrder() { return order; } /** * @param order * the order to set */ public void setOrder(Integer order) { this.order = order; } @Override public int compareTo(Person arg0) { return this.getOrder().compareTo(arg0.getOrder()); //这里定义你排序的规则。 } }

通过重写Comparable接口的compareTo方法,可以让程序按照我们想要的排列方式进行排序,如:这里我让Person按照order属性升序排序。

2)、测试类

public static void main(String[] args) {    //初始化数据    List
listA = new ArrayList
(); Person p1 = new Person(); Person p2 = new Person(); Person p3 = new Person(); p1.setName("name1"); p1.setOrder(1); p2.setName("name2"); p2.setOrder(2); p3.setName("name3"); p3.setOrder(3); listA.add(p2); listA.add(p1); listA.add(p3); //排序 Collections.sort(listA); //打印排序后的Person for (Person p : listA) { System.out.println(p.getName()); }}

3)、结果:

name1name2name3

3、通过重载Collections.sort方法                    

直接重载java.util.Collections.sort(java.util.List, java.util.Comparator) 方法。可以灵活的修改我们排序的方式,具体实现如下:

1)、Person实体类

  和上面的类相同,但没实现Comparable接口

public class Person {    private String name;    private Integer order;     /**     * @return the name     */    public String getName() {        return name;    }     /**     * @param name     *            the name to set     */    public void setName(String name) {        this.name = name;    }     /**     * @return the order     */    public Integer getOrder() {        return order;    }     /**     * @param order     *            the order to set     */    public void setOrder(Integer order) {        this.order = order;    } }

2)、测试类

public static void main(String[] args) {        List
listA = new ArrayList
(); Person p1 = new Person(); Person p2 = new Person(); Person p3 = new Person(); p1.setName("name1"); p1.setOrder(1); p2.setName("name2"); p2.setOrder(2); p3.setName("name3"); p3.setOrder(3); listA.add(p2); listA.add(p1); listA.add(p3); //直接在这里添加我们的排序规则 Collections.sort(listA, new Comparator
() { public int compare(Person arg0, Person arg1) { return arg0.getOrder().compareTo(arg1.getOrder()); } }); for (Person p : listA) { System.out.println(p.getName()); } }

从上面看到,直接在Conllections.sort()方法中重写了一个Comparator接口,可以在不同的地方使用Person集合的不同排序方法。如上面还是按照Person的order属性升序排列,我只要改写该方法,就可以在其他地方按照其他的规则对我的list集合进行排序,但是这样子代码看起来会比前面的那种方式繁琐。

3)、结果

name1name2name3

  致谢:感谢您的阅读!

 

 

4.扩展:按照两个字段排序      

比如先按照名字排序,如果名字相同,按照小名排序;例子如下:

package com.cy.model;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class Student implements Comparable
{ private int id; private String name; //名字 private String sname; //小名 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Student(int id, String name, String sname) { super(); this.id = id; this.name = name; this.sname = sname; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", sname=" + sname + "]"; } /** * student类的排序方法 * 先按照name排序,如果name相同按照sname排序 */ @Override public int compareTo(Student o) { int r1 = this.getName().compareToIgnoreCase(o.getName()); int r2 = this.getSname().compareToIgnoreCase(o.getSname()); return r1>0?1: r1<0?-1: r2>0?1: r2<0?-1:0; } //测试程序 public static void main(String[] args) { Student s1 = new Student(2,"zhangsan","z"); Student s2 = new Student(1, "zhangsan","b"); Student s3 = new Student(3, "zhangsan","y"); Student s4 = new Student(0, "lisi","s"); Student s5 = new Student(5, "wangwu","w"); Student s6 = new Student(10, "wangwu","xx"); Student s7 = new Student(8, "aming","ming"); List
list = new ArrayList
(); list.add(s1);list.add(s2);list.add(s3);list.add(s4); list.add(s5);list.add(s6);list.add(s7); Collections.sort(list); for(Student s : list){ System.out.println(s); } } }

打印:

Student [id=8, name=aming, sname=ming]Student [id=0, name=lisi, sname=s]Student [id=5, name=wangwu, sname=w]Student [id=10, name=wangwu, sname=xx]Student [id=1, name=zhangsan, sname=b]Student [id=3, name=zhangsan, sname=y]Student [id=2, name=zhangsan, sname=z]

 

转载于:https://www.cnblogs.com/tenWood/p/9023090.html

你可能感兴趣的文章
第四周作业
查看>>
Linux上的文件查找工具之locate与find
查看>>
LeetCode-Move Zeroes
查看>>
结对第2次作业——WordCount进阶需求
查看>>
Python面向对象之面向对象基本概念
查看>>
PDB文件:每个开发人员都必须知道的
查看>>
脸上有酒窝,脖子后有痣,胸前有颗痣,此三种人不能错过
查看>>
用VC++开发Oracle数据库应用程序详解2
查看>>
bzoj1305
查看>>
SpringAOP面向切面编程
查看>>
[USACO12JAN]Video Game Combos
查看>>
Multiset的使用 TOJ 2196.Nuanran's Idol II 与 UVA11136 Hoax or what
查看>>
Linux安装相关
查看>>
WIN7 下 在cmd 命令中 进入某个目录 的方法
查看>>
查看被锁的表和解锁
查看>>
canvas自适应圆形时钟绘制
查看>>
币值转换编程总结
查看>>
javascript中关于value的一个小知识点(value既是属性也是变量)
查看>>
cookie创建,使用 . session与Cookie区别
查看>>
截取字符串 substring substr slice
查看>>