/**
* @author hjn
* @entity Student
* @date 2017年5月23日15:22:18
*/
public class Student {
private String stuName;
private String stuSex;
private Integer stuAge; public Student() {
}
public Student(String stuName, String stuSex, Integer stuAge) {
super();
this.stuName = stuName;
this.stuSex = stuSex;
this.stuAge = stuAge;
} public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuSex() {
return stuSex;
}
public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
public Integer getStuAge() {
return stuAge;
}
public void setStuAge(Integer stuAge) {
this.stuAge = stuAge;
}
@Override
public String toString() {
return "学生 [姓名=" + stuName + ", 性别=" + stuSex + ", 年龄=" + stuAge + "]";
} }

  

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; /**
* @author hjn
* @class TestList
* @date 2017年5月23日15:24:18
*/
public class TestList { public static void main(String[] args) { Student stu1=new Student("张三","男",25);
Student stu2=new Student("李四","男",22);
Student stu3=new Student("王五","男",26);
Student stu4=new Student("赵六","男",25);
Student stu5=new Student("麻七","男",28);
Student stu6=new Student("二狗","男",21);
List<Student> list=new ArrayList<Student>();
list.add(stu1);list.add(stu2);
list.add(stu3);list.add(stu4);
list.add(stu5);list.add(stu6); System.out.println("排序前:");
for (Student student : list) {
System.out.println(student.toString());
} Collections.sort(list, new Comparator<Student>(){ @Override
public int compare(Student o1, Student o2) {
if(o1.getStuAge()>o2.getStuAge()){
return 1;
}
if(o1.getStuAge()==o2.getStuAge()){
return 0;
}
return -1;
}
});
System.out.println("排序后:");
for (Student student : list) {
System.out.println(student.toString());
} } }

  输出结果:

排序前:
学生 [姓名=张三, 性别=男, 年龄=25]
学生 [姓名=李四, 性别=男, 年龄=22]
学生 [姓名=王五, 性别=男, 年龄=26]
学生 [姓名=赵六, 性别=男, 年龄=25]
学生 [姓名=麻七, 性别=男, 年龄=28]
学生 [姓名=二狗, 性别=男, 年龄=21]
排序后:
学生 [姓名=二狗, 性别=男, 年龄=21]
学生 [姓名=李四, 性别=男, 年龄=22]
学生 [姓名=张三, 性别=男, 年龄=25]
学生 [姓名=赵六, 性别=男, 年龄=25]
学生 [姓名=王五, 性别=男, 年龄=26]
学生 [姓名=麻七, 性别=男, 年龄=28]

Collections的sort方法:

public static <T extends Comparable<? supper T>> void sort(List<T> list)

根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable接口。此外,列表中的所有元素都必须是可相互比较的。也就是说对于列表中的任何e1和e2元素,e1.compareTo(e2)不得抛出ClassCastException。

此排序方法具有稳定性,不会因为调用sort方法而对相等的元素进行重新排序。
指定列表必须是可修改的,但不必是大小可调整的。
该排序算法是一个经过修改的合并排序算法,其中 如果低子列表中的最高元素小鱼高子列表中的最低元素,则忽略合并。此算法提供可摆正的n log(n)性能。此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置处每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的n² log(n)性能。

抛出 ClassCastException ---如果列表包含不可相互比较的元素 例如 字符串和整数。
抛出 UnsupportedOperationException ---如果指定列表的列表迭代器不支持set操作。

  

public static <T> void sort(List<T> list , Comparable<? supper T> c)

根据指定比较器产生的顺序对指定列表进行排序。此列标内的所有元素都必须可使用指定比较器相互比较 也就是说 对于列表中的任意 e1 和e2元素,c.compare(e1,e2)不得抛出ClassCastException。

次排序被保证是稳定的,不会因调用sort而对相等的元素进行重新排序。
排序算法是一个经过修改的合并排序算法 其中 如果低子列表中的最高元素小鱼高子列表中的最低元素,则忽略合并。此算法提供可摆正的n log(n)性能。指定列表必须是可修改的,但不鄙视可大小调整的。此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的n? log(n)性能。

抛出 ClassCastException ---如果列表包含不可使用指定比较器相互比较的元素。
抛出 UnsupportedOperationException ---如果指定列表的列表迭代器不支持set操作。

接口 Comparator<T>

public interface Comparator<T>

强行对某个对象 collection 进行整体排序的比较函数。可以将Comparator传递给sort方法 例如:Collections.sort或Arrays.sort,从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构 (如 有序set 或有序映射) 的顺序,或者为那些没有自然顺序的对象collection提供排序。

当且仅当对于一组元素s中的每个e1和e2而言,c.compare(e1,e2)==0 与 e1..equals(e2)具有相等的布尔值时,Comparator c 强行对s进行的排序才叫做与equals一致的排序。

当使用具有与equals不一致的强行排序能力的Comparator 对有序set或有序映射进行排序时,应该小心谨慎。假定一个带显示Comparator c的有序set或有序映射与set S中抽取出来的元素或键一起使用。如果c强行对s进行的排序是与equals 不一致的,那么有序set或有序映射将是行为"怪异的"。尤其是有序set或有序映射 将违背根据equals 所定义的set或映射的常规协定。

例如 假定使用Comparator c 将满足(a.equals(b) && c.compare(a,b) !=0)的两个元素 a和b添加到一个空的TreeSet中,则第二个add将返回true(TreeSet的大小将会增加),因为从TreeSet的角度来看,a,b是不相等的,即使这与 Set.add方法的规范相反。

注:通常来说,让Comparator也实现java.io.Serializable 是一个好主意 ,因为他们在序列化的数据结构 像TreeSet 、TreeMap中可用作排序方法。为了成功地序列化数据结构,Comparator必须实现Serializable。

在算数上,定义给定Comparator c 对给定对象set s实施强行排序的关系为:

{(x,y)such that c.compare(x,y)<=0}

在整体排序的系数(quotient)为

{(x,y)such that c.compare(x,y)==0}

它直接遵循compare 的协定,系数是s上的等价关系,强行排序时s上的整体排序。当我们说c强行对s的排序时与equals 一致是,意思是说排序的系数是对象的equals(Object)方法所定义的等价关系:

{(x,y)such that x,equals(y)}

Comparator的方法

int compare(T o1,T o2)

比较用来排序的两个参数。根据第一个参数小于等于或大于第二个参数分别返回负整数、零、或正整数。

抛出 ClassCastException --- 如果参数的类型不允许此Comparator 对他们进行比较。
boolean equals(Object obj)

指示某个其他对象是否"等于"此Comparator。此方法必须遵守Object.equals(Object)的常规协定。此外,仅当指定的对象也是一个Comparator,并且强行实施与此Comparator相同的排序时,此方法才返回true。

注意,不重写Object.equals(Object)方法总是安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的Comparator是否强行实施了相同的排序,从而提高性能。

  

关于List<T> 的排序的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  3. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  4. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  5. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  6. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  7. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  8. javascript排序

    利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...

  9. iOS自定义model排序

    在开发过程中,可能需要按照model的某种属性排序. 1.自定义model @interface Person : NSObject @property (nonatomic,copy) NSStri ...

  10. Lucene4.4.0 开发之排序

    排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最 ...

随机推荐

  1. 开启 .NET Core 的新篇章

    今天开始要开始研究.net core了 规划了一下要学习的点: 1.CentOS7 2.asp.net Core 3.Linux的常用命令与运维 4.nginx的常用配置 5.mysql的使用与日常维 ...

  2. 伸展树(Splay树)的简要操作

    伸展树(splay树),是二叉排序树的一种.[两个月之前写过,今天突然想写个博客...] 伸展树和一般的二叉排序树不同的是,在每次执行完插入.查询.删除等操作后,都会自动平衡这棵树.(说是自动,也就是 ...

  3. 设计模式的征途—3.工厂方法(Factory Method)模式

    上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...

  4. C++模板--实现容器适配器

    STL源码初接触 STL = Standard Template Library,直译过来是:标准模板库,是惠普实验室开发的一系列软件的统称.从根本上说,STL是一些"容器"的集合 ...

  5. Ajax 与 Comet

    Ajax技术的核心是XMLHttpRequest对象(简称XHR). XMLHttpRequest对象 在浏览器中创建XHR对象要像下面这样,使用XMLHttpRequest构造函数. var xhr ...

  6. angular 过滤排序

    <table class="table"> <thead> <tr> <th ng-click="changeOrder('id ...

  7. React服务器渲染最佳实践

    源码地址:https://github.com/skyFi/dva-starter React服务器渲染最佳实践 dva-starter 完美使用 dva react react-router,最好用 ...

  8. 在c++中,标准输入string时cin 与getline两个函数之间的区别

    cin: cin函数是标准库的输入函数,在读取string时遵循以下规则: 1)读取并忽略开头所有的空白符(包括空格.换行符.制表符). 2)读取字符直到遇到空白符,读取终止. 例如: 当输入的是“  ...

  9. ZJOI2008树的统计Count

    知识点-树链剖分 "在一棵树上进行路径的修改.求极值.求和":乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的.我们需要用到一种貌似高级的复杂算法--树链剖分.   ...

  10. stm32中断学习总结

    经过了两天,终于差不多能看懂32的中断了,由于是用的库函数操作的,所以有些内部知识并没有求甚解,只是理解知道是这样的.但对于要做简单开发的我来说这些已经够了. 我学习喜欢从一个例程来看,下面的程序是我 ...