我们在实际的开发工作中,经常会碰到排序的问题,如题,我们如何针对List集合中的某一个属性进行排序

当list集合中的元素类型是我们自定义类型时,有两种对list中的元素进行排序的方法:

方法一

  让list集合中的元素类型,也就是我们自定义的类实现Comparable<T>接口,并在类中编写public int compareTo(T o)方法。如下所示:

 1 public class Test
2 {
3 public static void main(String[] args)
4 {
5 ArrayList<Entity> list=new ArrayList<Entity>();
6 list.add(new Entity("李四",24));
7 list.add(new Entity("张三",13));
8 list.add(new Entity("王五",25));
9 System.out.println("排序前:"+list);
10 Collections.sort(list);
11 System.out.println("排序后:"+list);
12 }
13 }
14 class Entity implements Comparable<Entity>
15 {
16 String name;
17 int age;
18 public Entity(String name, int age) {
19 super();
20 this.name = name;
21 this.age = age;
22 }
23 public String getName() {
24 return name;
25 }
26 public void setName(String name) {
27 this.name = name;
28 }
29 public int getAge() {
30 return age;
31 }
32 public void setAge(int age) {
33 this.age = age;
34 }
35 @Override
36 public String toString() {
37 return "Entity [name=" + name + ", age=" + age + "]";
38 }
39 @Override
40 public int compareTo(Entity o)
41 {
42 if(this.getAge()>o.getAge())
43 {
44 return 1;
45 }
46 else if(this.getAge()<o.getAge())
47 {
48 return -1;
49 }
50 else
51 {
52 return 0;
53 }
54 }
55 }

  我们想对Entity这个类型按照age属性值从小到大排序,则方法一是让Entity这个类实现Comparable<Entity>接口,并编写public int compareTo(Entity o) 方法。这样使用Collections.sort(list);就可以对list中的对象进行按照age大小排序。

输出结果:

排序前:[Entity [name=李四, age=24], Entity [name=张三, age=13], Entity [name=王五, age=25]]
排序后:[Entity [name=张三, age=13], Entity [name=李四, age=24], Entity [name=王五, age=25]]

方法二

  方法二就是在排序的时候,给sort()方法传入一个比较器。具体来说,就是传入一个实现比较器接口的匿名内部类,目的是告诉sort()方法,按照比较器来对list中的对象进行排序。如下所示:

 1 public class Test
2 {
3 public static void main(String[] args)
4 {
5 ArrayList<Entity> list=new ArrayList<Entity>();
6 list.add(new Entity("李四",24));
7 list.add(new Entity("张三",13));
8 list.add(new Entity("王五",25));
9 System.out.println("排序前:"+list);
10 Collections.sort(list,new Comparator<Entity>() {
11 @Override
12 public int compare(Entity o1, Entity o2)
13 {
14 if(o1.getAge()>o2.getAge())
15 {
16 return 1;
17 }
18 else if(o1.getAge()<o2.getAge())
19 {
20 return -1;
21 }
22 else
23 {
24 return 0;
25 }
26 }
27 });
28 System.out.println("排序后:"+list);
29 }
30 }
31 class Entity
32 {
33 String name;
34 int age;
35 public Entity(String name, int age) {
36 super();
37 this.name = name;
38 this.age = age;
39 }
40 public String getName() {
41 return name;
42 }
43 public void setName(String name) {
44 this.name = name;
45 }
46 public int getAge() {
47 return age;
48 }
49 public void setAge(int age) {
50 this.age = age;
51 }
52 @Override
53 public String toString() {
54 return "Entity [name=" + name + ", age=" + age + "]";
55 }
56 }

  当给sort()方法传入比较器的时候,sort()方法就会根据比较器来对list中的对象进行排序。

输出结果:

排序前:[Entity [name=李四, age=24], Entity [name=张三, age=13], Entity [name=王五, age=25]]
排序后:[Entity [name=张三, age=13], Entity [name=李四, age=24], Entity [name=王五, age=25]]

  而sort()方法为什么能对String类型的数据进行排序呢?

  答案是,String这个类实现了Comparable<String>接口。所以,可以直接用Collections.sort(list);来对String类型的数据进行排序。

如何对List集合中的对象进行按某个属性排序的更多相关文章

  1. List集合中的对象按照某个字段去重实现

    package com.liying.banana.user; import java.util.ArrayList; import java.util.Comparator; import java ...

  2. 向集合中添加Person类型并对其排序

    package com.bjpowernode.t03sort; import java.util.ArrayList;import java.util.Collections; /* * 向集合中添 ...

  3. 将java中Map对象转为有相同属性的类对象(json作为中间转换)

    java中Map对象转为有相同属性的类对象(json作为中间转换) 准备好json转换工具类 public class JsonUtil { private static ObjectMapper o ...

  4. 对list集合中的对象进行排序(转载)

    原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元 ...

  5. Struts2的表单标签还可以为集合中的对象赋值

    •Struts 还允许填充 Collection 里的对象, 这常见于需要快速录入批量数据的场合   代码如下 : TestCollectionAction.java package com.atgu ...

  6. JAVA里List集合中的对象根据对象的某个属性值降序或者升序排序

    需要使用JDK1.8及以上 package com.stream; import java.util.Comparator; import java.util.List; public class T ...

  7. List集合中的数据按照某一个属性进行分组

    有的时候,我们需要在java中对集合中的数据进行分组运算.例如:Bill对象有money(float)和type(String)属性,现有个集合List<Bill>,需要按照Bill的ty ...

  8. 关于java中对list集合中的数据按照某一个属性进行分组

    有的时候,我们需要在java中对集合中的数据进行分组运算. 例如:Bill对象有money(float)和type(String)属性,现有个集合List<Bill>,需要按照Bill的t ...

  9. 用Java集合中的Collections.sort方法对list排序的两种方法

    用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

随机推荐

  1. python3 结束进程

    为什么会去结束进程呢?因为在做appium中遇到H5跳转了多个页面的时候,出现了获取的pagesource是上一个页面的情况,这时候就需要先退出webview,然后杀掉chromedriver的进程, ...

  2. 从面向过程到面向对象再到MVC

    /* * * title: 从面向过程到面向对象再到MVC * author: tanghao * date: 2020.9.30 * version: 1.0 * */ 前言 本文档通过一个显示20 ...

  3. 单例模式,reorder详解,线程安全,双检查锁

    单例模式,分为饿汉式单例 和 懒汉式单例. 先把本类对象所需内存在main函数执行前就new出来,这是饿汉式单例. 个人思考: 为什么饿汉式不独霸天下,还有什么必要去研究使用cpp11上支持的双检查锁 ...

  4. 03 Comments in C Programming C编程中的注释

    Comments 注释简介 Let's take a quick break from programming and talk about comments. Comments help progr ...

  5. FOV

    来源:https://blog.csdn.net/chepwavege/article/details/98876550 视场 (视图字段) 是指现场对面相机镜头的立体角.图如下图所示︰ 高频通气︰  ...

  6. 099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类

    099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...

  7. Android高级控件(下)

    计时器(Chronometer) getBase() 基准时间 setFormat() 设置显示格式 start() 开始计时 stop() 停止计时 setOnChronometerListener ...

  8. 开始在Windows上开发Android

    介绍 鉴于您正在阅读这篇文章,您很可能已经知道android是什么了.可能.在科幻小说和电影中,机器人本质上是具有拟人化特征的机器人.还记得<星球大战>里的C-3PO吗?那<星际迷航 ...

  9. RHSA-2017:3075-重要: wget 安全更新(代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  10. 学习WebDav

    目录 前言 初识WebDav 有哪些支持webdav的网盘? WebDAV的特性和优势 服务端的搭建 调用WebDav接口 PROPFIND方法 PROPPATCH方法 MKCOL方法 PUT方法 G ...