我们在实际的开发工作中,经常会碰到排序的问题,如题,我们如何针对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. tensorflow(一):基础

    一.张量 1.张量的概念 在TensorFlow中,所有的数据都通过张量的形式来表示.从功能的角度,张量可以简单理解为多维数组,零阶张量表示标量(scalar),也就是一个数:一阶张量为向量(vect ...

  2. python基础知识 变量 数据类型 if判断

    cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类的大脑 飞机 内存:暂时存储一些数据,临时加载数据和应用程序 4G 8G 16G 32G 速度快,高铁 断电即消失 造价高 硬盘 ...

  3. 【网络协议】TCP/IP:数据链路层

    物理层负责把计算机中的0.1数字信号转换为具体传输媒介的物理信号(电压的高低.电波的强弱.光的闪灭) 数据链路层协议定义了(通过通信介质互连的设备间的)数据传输规范 (常见的通信介质有同轴电缆.双绞线 ...

  4. P1879 [USACO06NOV] Corn Fields G

    题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他 ...

  5. 第3天 | 12天搞定Python,用VSCode编写代码

    Visual Studio Code (简称 VS Code), 是一款免费并且开源的现代化轻量级代码编辑器,支持语法高亮.智能代码补全.自定义热键.括号匹配.代码片段等特性,并针对网页开发做了优化. ...

  6. Python的逻辑控制true/false和循环

    逻辑判断 简单的几个尝试,看下和java的一点不同之处 1 > 2 # False 1 < 2 <3 # True 42 != '42' # True 'Name' == 'name ...

  7. jvm堆内存和GC简介

    最近经常遇到jvm内存问题,觉得还是有必要整理下jvm内存的相关逻辑,这里只描述jvm堆内存,对外内存暂不阐述. jvm内存简图 jvm内存分为堆内存和非堆内存,堆内存分为年轻代.老年代,非堆内存里只 ...

  8. python -re库

    正则表达式的语法 正则表达式语法由字符和操作符构成 正则表达式的常用操作符: print("--正则表达式常用操作符--") mata="11356352135 abcd ...

  9. 写给前端同学的C++入门教程(一):概述和环境搭建

    说明:本人是前端er,因为最近对 UE4(一个游戏开发引擎)产生了兴趣,而这个引擎源开发游戏时需要用到 C++ ,所以就开始入坑 C++ 了.现将自己学习 C++ 的笔记整理并分享出来,以便一些想入门 ...

  10. go sync.WaitGroup

    package mainimport ( "fmt" "sync")func say(i int ,wg *sync.WaitGroup) { defer wg ...