一、背景

1.软件开发过程中集合排序是比较强大的功能,会使用集合Map、Set、List实现排序功能,知道匿名内部类Comparator很关键,搞清楚集合排序的性能开销,排序遇到的坑以及解决的方法,注意下面的例子都是JDK1.8的用法。

二、LIst集合排序

1.UML类图

2.重点分析下ArrayList的排序,毕竟实战开发用的最频繁的就是它了

三、第一种做法

介绍:这种叫定制排序,或自定义排序,需编写匿名内部类,先new一个Comparator接口的比较器对象c,同时实现compare()其方法; 
然后将比较器对象c传给Collections.sort()方法的参数列表中,实现排序功能;一般用这种的比较多。

1.实体类(private int id)

public class Person{private int id;private String name;private String address;public Person(int id, String name, String address) {this.id = id;this.name = name;this.address = address;}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 getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Person{" +"id='" + id + '\'' +", name='" + name + '\'' +", address='" + address + '\'' +'}';}
}

2.测试类

public class ArrayListTest {public static void main(String[] args) {List<Person> list=Lists.newArrayList();//产生10以内的随机数int num = (int)(Math.random()*1000+1);for(int i=num;i>0;i--){list.add(new Person(i,"张三","河南"));}for(Object o : list){System.out.println(o);}System.out.println("++++++++++++++++++++++++++++++++++++");Collections.sort(list, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {if (o1.getId() > o2.getId()) {return 1;} else if (o1.getId() < o2.getId()) {return -1;}return 0;}});for(Object o : list){System.out.println(o);}}
}

3.结果(升序)

Person{id='10', name='张三', address='河南'}
Person{id='9', name='张三', address='河南'}
Person{id='8', name='张三', address='河南'}
Person{id='7', name='张三', address='河南'}
Person{id='6', name='张三', address='河南'}
Person{id='5', name='张三', address='河南'}
Person{id='4', name='张三', address='河南'}
Person{id='3', name='张三', address='河南'}
Person{id='2', name='张三', address='河南'}
Person{id='1', name='张三', address='河南'}
++++++++++++++++++++++++++++++++++++
Person{id='1', name='张三', address='河南'}
Person{id='2', name='张三', address='河南'}
Person{id='3', name='张三', address='河南'}
Person{id='4', name='张三', address='河南'}
Person{id='5', name='张三', address='河南'}
Person{id='6', name='张三', address='河南'}
Person{id='7', name='张三', address='河南'}
Person{id='8', name='张三', address='河南'}
Person{id='9', name='张三', address='河南'}
Person{id='10', name='张三', address='河南'}

四、第二中做法

1.实体类(private String id)

public class Person{private String id;private String name;private String address;public Person(String id, String name, String address) {this.id = id;this.name = name;this.address = address;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Person{" +"id='" + id + '\'' +", name='" + name + '\'' +", address='" + address + '\'' +'}';}
}

2.测试类

public class ArrayListTest {public static void main(String[] args) {List<Person> list=Lists.newArrayList();//产生10以内的随机数int num = (int)(Math.random()*100+1);for(int i=num;i>0;i--){list.add(new Person(""+i,"张三","河南"));}for(Object o : list){System.out.println(o);}System.out.println("++++++++++++++++++++++++++++++++++++");Collections.sort(list, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return  new Double(o1.getId()).compareTo(new Double(o2.getId()));}});for(Object o : list){System.out.println(o);}}
}

3.结果

Person{id='10', name='张三', address='河南'}
Person{id='9', name='张三', address='河南'}
Person{id='8', name='张三', address='河南'}
Person{id='7', name='张三', address='河南'}
Person{id='6', name='张三', address='河南'}
Person{id='5', name='张三', address='河南'}
Person{id='4', name='张三', address='河南'}
Person{id='3', name='张三', address='河南'}
Person{id='2', name='张三', address='河南'}
Person{id='1', name='张三', address='河南'}
++++++++++++++++++++++++++++++++++++
Person{id='1', name='张三', address='河南'}
Person{id='2', name='张三', address='河南'}
Person{id='3', name='张三', address='河南'}
Person{id='4', name='张三', address='河南'}
Person{id='5', name='张三', address='河南'}
Person{id='6', name='张三', address='河南'}
Person{id='7', name='张三', address='河南'}
Person{id='8', name='张三', address='河南'}
Person{id='9', name='张三', address='河南'}
Person{id='10', name='张三', address='河南'}

五、第三种做法

另外一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则。

1.实体类

public class Person implements Comparable{private String id;private String name;private String address;public Person(String id, String name, String address) {this.id = id;this.name = name;this.address = address;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Person{" +"id='" + id + '\'' +", name='" + name + '\'' +", address='" + address + '\'' +'}';}@Overridepublic int compareTo(Object o) {if (o instanceof Person){Person o1 = (Person)o;return  new Double(this.getId()).compareTo(new Double(o1.getId()));}throw new ClassCastException("不能转换为Person类型的对象...");}
}

2.测试类

public class ArrayListTest {public static void main(String[] args) {List<Person> list=Lists.newArrayList();//产生10以内的随机数int num = (int)(Math.random()*100+1);for(int i=num;i>0;i--){list.add(new Person(""+i,"张三","河南"));}for(Object o : list){System.out.println(o);}System.out.println("++++++++++++++++++++++++++++++++++++");Collections.sort(list);for(Object o : list){System.out.println(o);}}
}

3.结果

Person{id='10', name='张三', address='河南'}
Person{id='9', name='张三', address='河南'}
Person{id='8', name='张三', address='河南'}
Person{id='7', name='张三', address='河南'}
Person{id='6', name='张三', address='河南'}
Person{id='5', name='张三', address='河南'}
Person{id='4', name='张三', address='河南'}
Person{id='3', name='张三', address='河南'}
Person{id='2', name='张三', address='河南'}
Person{id='1', name='张三', address='河南'}
++++++++++++++++++++++++++++++++++++
Person{id='1', name='张三', address='河南'}
Person{id='2', name='张三', address='河南'}
Person{id='3', name='张三', address='河南'}
Person{id='4', name='张三', address='河南'}
Person{id='5', name='张三', address='河南'}
Person{id='6', name='张三', address='河南'}
Person{id='7', name='张三', address='河南'}
Person{id='8', name='张三', address='河南'}
Person{id='9', name='张三', address='河南'}
Person{id='10', name='张三', address='河南'}

六、结束

今天就写到这吧,太困了,晚安!各位,希望能帮到你们。

Always keep the faith!!!

java中的各种集合排序相关推荐

  1. Java中对List集合排序的两种方法

    第一种方法,就是list中对象实现Comparable接口,代码如下: public class Person implements Comparable<Person> {private ...

  2. java List最大_在java中获取List集合中最大的日期时间操作

    取list集合中最大的日期, 可以用date max = collections.max(datelist);, 传入一个日期集合, 就可以获取, 工作中有这个需求, 就查找到这个, 代码如下 } e ...

  3. java中如何对对象排序?

    大家好,我是雄雄. 前言: 我们知道,在平时做项目的过程中,我们总会用到各种各样的排序,或是升序,或是降序.在java中,要实现排序有好多中方式,比如我们耳熟能详的冒泡排序.选择排序等,但是我们一般都 ...

  4. java实现List/Set集合排序:集合内容是字符串,字符串(包含汉字,英文字母,数字)集合的排序

    java实现List/Set集合排序:集合内容是字符串,字符串(包含汉字,英文字母,数字)集合的排序 工具类如下: package com.acconsys.util;import java.util ...

  5. java中的五种排序方法_用Java排序的五种有用方法

    java中的五种排序方法 Java排序快速概述: 正常的列表: private static List VEGETABLES = Arrays.asList("apple", &q ...

  6. Java中如何克隆集合——ArrayList和HashSet深拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法 ...

  7. java中如何上送list集合_如何使用java中的list集合

    如何使用java中的list集合 发布时间:2020-06-26 14:45:11 来源:亿速云 阅读:88 作者:Leah 如何使用java中的list集合?针对这个问题,这篇文章详细介绍了相对应的 ...

  8. java 集合初始化_6种方法初始化JAVA中的list集合

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 1.常规方式 List languages = ne ...

  9. [转载] java中对数组进行排序_如何在Java中对数组排序

    参考链接: Java中main()的有效变体 java中对数组进行排序 Java Array is like a container that can hold a fixed number of t ...

  10. java对列表数据排序_如何在Java中对列表进行排序

    java对列表数据排序 Sometimes we have to sort a list in Java before processing its elements. In this tutoria ...

最新文章

  1. S60 V3版SDK的官方扩展插件
  2. Centos7 设置DNS 服务器
  3. 极客新闻——09、如何打造核心骨干团队
  4. 报错解决办法 SLF4J: Failed to load class org.slf4j.impl.StaticLoggerBinder
  5. JavaScript学习笔记(5)
  6. 干货:RabbitMQ消息队列基本原理介绍
  7. 操作系统:Win10系统下LocalNow和Roaming文件夹介绍
  8. 大学计算机基础徐久成pdf,大学计算机基础徐久成王岁花版第7章.pptx
  9. ASP.NET MVC载入页面常用方法
  10. Linux about MySQL
  11. asp.net+mysql,asp.net+mysql后台盲注入
  12. 爬虫(六十九)简明 jieba 中文分词教程(六十)
  13. 稳定版本php源包下载,PHPWind历史版本及升级包下载(v1.0.0 - v9.0.2、Ofstar to PW)20170501更新...
  14. 中国十大名牌直流稳压电源
  15. 微信抽奖小程序怎么做怎么弄?微信抽奖小程序制作方法详细介绍
  16. 高德地图API之定位API
  17. 图像数据标记-图片筛选教程
  18. 基岩版刷铁傀儡机制和Java_我的世界:Java版1.14获得铁傀儡的四种方式,第三种千万别忘记...
  19. 解决硬盘分区错误, 纯Dos磁盘工具Diskpart的用法.
  20. 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)

热门文章

  1. Python中写入文件操作
  2. idea 因破解而无法打开的问题
  3. netty 原理分析
  4. 软件项目运维内容 软件系统运维工作内容
  5. 高鸿业宏观经济学第七版答案
  6. Mac source环境变量配置
  7. servlet运行html乱码,使用tomcat运行servlet时中文乱码的解决
  8. matlab画柱状图
  9. Codeforces-785-D(范德蒙恒等式)
  10. 触摸按键设计参考与问题总结