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<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;
} @Override
public int compareTo(Person arg0) {
return this.getOrder().compareTo(arg0.getOrder()); //这里定义你排序的规则。
} }

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

2)、测试类

public static void main(String[] args) {
//初始化数据
List<Person> listA = new ArrayList<Person>();
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)、结果:

name1
name2
name3

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<Person> listA = new ArrayList<Person>();
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<Person>() {
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)、结果

name1
name2
name3

  致谢:感谢您的阅读!

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

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

package com.cy.model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class Student implements Comparable<Student>{
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<Student> list = new ArrayList<Student>();
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]

(转载)java list排序的更多相关文章

  1. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  2. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

  3. java 集合排序(转)

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  4. java:高速排序算法与冒泡排序算法

     Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /**   *  * @Description:  * @author:cuiyaon ...

  5. java常见排序方法

    1.java常用排序方法 1) 选择排序         原理:a. 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.   ...

  6. java希尔排序

    java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...

  7. Java八大排序算法

    Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...

  8. Java常用排序算法及性能测试集合

    测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...

  9. java 集合排序

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

随机推荐

  1. HDU2019数列有序!

    Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序. Input 输入数据包含多个测 ...

  2. FTP相关、用vsftpd搭建ftp、xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务

    1.FTP相关(file transfer protocol,文件传输协议)   2.用vsftpd搭建ftp安装:yum install vsftpd -y创建一个虚拟用户:useradd  vft ...

  3. Django--路由控制 ——URL反向解析

    Django--路由控制 本文目录 一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 回到目录 一 Djan ...

  4. yum小结

    1.查看系统默认安装的yum# rpm -qa|grep yum2.卸载yum# rpm -e yum-fastestmirror-... yum-metadata-parser-... yum-3. ...

  5. codeforce 804B Minimum number of steps

    cf劲啊 原题: We have a string of letters 'a' and 'b'. We want to perform some operations on it. On each ...

  6. js动态加载数据并合并单元格

    js动态加载数据合并单元格, 代码如下所示,可复制直接运行: <!DOCTYPE HTML> <html lang="en-US"> <head> ...

  7. JSON字符串转C#实体Class类

    在项目开发过程中,经常需要和不同部门或者不同的组员一起协同工作,但对方写的json返回的结果集,我们需要用,那么如何来生成对应的类代码和实体对象呢?于是参考了网上的做法,做一个简单的字符串转实体类的功 ...

  8. 【转】C#获取当前日期时间(转)

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...

  9. Go mysql使用举例

    下载MySQL驱动 $ go get github.com/go-sql-driver/mysql 或者下载源码放到GOPATH中,下载地址:https://github.com/go-sql-dri ...

  10. ML: 降维算法-LLE

    局部线性嵌入 (Locally linear embedding)是一种非线性降维算法,它能够使降维后的数据较好地保持原有 流形结构 .LLE可以说是流形学习方法最经典的工作之一.很多后续的流形学习. ...