如何对List集合中的对象进行按某个属性排序
我们在实际的开发工作中,经常会碰到排序的问题,如题,我们如何针对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集合中的对象进行按某个属性排序的更多相关文章
- List集合中的对象按照某个字段去重实现
		
package com.liying.banana.user; import java.util.ArrayList; import java.util.Comparator; import java ...
 - 向集合中添加Person类型并对其排序
		
package com.bjpowernode.t03sort; import java.util.ArrayList;import java.util.Collections; /* * 向集合中添 ...
 - 将java中Map对象转为有相同属性的类对象(json作为中间转换)
		
java中Map对象转为有相同属性的类对象(json作为中间转换) 准备好json转换工具类 public class JsonUtil { private static ObjectMapper o ...
 - 对list集合中的对象进行排序(转载)
		
原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元 ...
 - Struts2的表单标签还可以为集合中的对象赋值
		
•Struts 还允许填充 Collection 里的对象, 这常见于需要快速录入批量数据的场合 代码如下 : TestCollectionAction.java package com.atgu ...
 - JAVA里List集合中的对象根据对象的某个属性值降序或者升序排序
		
需要使用JDK1.8及以上 package com.stream; import java.util.Comparator; import java.util.List; public class T ...
 - List集合中的数据按照某一个属性进行分组
		
有的时候,我们需要在java中对集合中的数据进行分组运算.例如:Bill对象有money(float)和type(String)属性,现有个集合List<Bill>,需要按照Bill的ty ...
 - 关于java中对list集合中的数据按照某一个属性进行分组
		
有的时候,我们需要在java中对集合中的数据进行分组运算. 例如:Bill对象有money(float)和type(String)属性,现有个集合List<Bill>,需要按照Bill的t ...
 - 用Java集合中的Collections.sort方法对list排序的两种方法
		
用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
 
随机推荐
- python3 结束进程
			
为什么会去结束进程呢?因为在做appium中遇到H5跳转了多个页面的时候,出现了获取的pagesource是上一个页面的情况,这时候就需要先退出webview,然后杀掉chromedriver的进程, ...
 - 从面向过程到面向对象再到MVC
			
/* * * title: 从面向过程到面向对象再到MVC * author: tanghao * date: 2020.9.30 * version: 1.0 * */ 前言 本文档通过一个显示20 ...
 - 单例模式,reorder详解,线程安全,双检查锁
			
单例模式,分为饿汉式单例 和 懒汉式单例. 先把本类对象所需内存在main函数执行前就new出来,这是饿汉式单例. 个人思考: 为什么饿汉式不独霸天下,还有什么必要去研究使用cpp11上支持的双检查锁 ...
 - 03 Comments in C Programming  C编程中的注释
			
Comments 注释简介 Let's take a quick break from programming and talk about comments. Comments help progr ...
 - FOV
			
来源:https://blog.csdn.net/chepwavege/article/details/98876550 视场 (视图字段) 是指现场对面相机镜头的立体角.图如下图所示︰ 高频通气︰ ...
 - 099 01 Android 零基础入门  02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类
			
099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...
 - Android高级控件(下)
			
计时器(Chronometer) getBase() 基准时间 setFormat() 设置显示格式 start() 开始计时 stop() 停止计时 setOnChronometerListener ...
 - 开始在Windows上开发Android
			
介绍 鉴于您正在阅读这篇文章,您很可能已经知道android是什么了.可能.在科幻小说和电影中,机器人本质上是具有拟人化特征的机器人.还记得<星球大战>里的C-3PO吗?那<星际迷航 ...
 - RHSA-2017:3075-重要: wget 安全更新(代码执行)
			
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
 - 学习WebDav
			
目录 前言 初识WebDav 有哪些支持webdav的网盘? WebDAV的特性和优势 服务端的搭建 调用WebDav接口 PROPFIND方法 PROPPATCH方法 MKCOL方法 PUT方法 G ...