List自定义对象的排序,根据对象的某一列进行排序
在工作中,经常需要对List对象集合进行排序操作,下面总结下搞个通用排序对象,原理是使用JAVA的
Comparator 接口实现排序 不多说直接上“干货”
1、存在实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
class Book {
private Long id;//编号
private String userName;//书本名称
private double productPrice;//书本价格
private String author;//作者
private Integer weight;//权重
}
2、SortList 排序实现通用类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SortList<T> implements Comparator<T> { //需要比较的对象属性字段名称
private String propertyName;
//是否是升序排序
private boolean isAsc; /**
* 需要的是:根据类中的字段对对象进行排序
*
* @return
*/ @Override
public int compare(T b1, T b2) { Class<?> clz = b1.getClass();
Method method = getPropertyMethod(clz, propertyName);
try { Object objectOne = method.invoke(b1); Object objectTwo = method.invoke(b2); if (objectOne == null || objectTwo == null) {
return 0;
} Comparable value1 = (Comparable) objectOne; Comparable value2 = (Comparable) objectTwo; if (isAsc) {
return value1.compareTo(value2);
} else {
return value2.compareTo(value1);
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
} // 获取类名
public static Method getPropertyMethod(Class clz, String propertyName) {
Method method = null;
try {
method = clz.getMethod("get" + firstUpperCase(propertyName));
} catch (Exception e) {
System.out.println("获取类名发生错误!");
}
return method;
} /**
* 首字母大写方法
* @param str
* @return
*/
public static String firstUpperCase(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z') {
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
} }
3、实际使用测试如下: 主要这么来使用
Collections.sort(bookList, new SortList<Book>("productPrice",true));
测试
@Test
public void sortBook() {
List<Book> bookList = getBookList();
System.out.println("原先的顺序:");
printf(bookList); System.out.println("根据价格排序:");
Collections.sort(bookList, new SortList<Book>("productPrice",true));
printf(bookList); System.out.println("根据Id排序:");
Collections.sort(bookList, new SortList<Book>("id",false));
printf(bookList); System.out.println("根据weight排序:");
Collections.sort(bookList, new SortList<Book>("weight",true));
printf(bookList); System.out.println("根据userName排序:");
Collections.sort(bookList, new SortList<Book>("userName",true));
printf(bookList); } public List<Book> getBookList() {
List<Book> books = Lists.newArrayList();
Book book1 = new Book(1L, "first", 10.00, "zhangsan", 19);
Book book2 = new Book(2L, "wirst", 9.00, "zhangsan", 24);
Book book3 = new Book(3L, "eirst", 8.00, "zhangsan", 29);
Book book4 = new Book(4L, "girst", 7.00, "zhangsan", 13);
Book book5 = new Book(5L, "tirst", 6.00, "zhangsan", 14); books.add(book1);
books.add(book2);
books.add(book3);
books.add(book4);
books.add(book5); return books;
} /**
* 打印函数
*
* @param lisbk
*/
public void printf(List<Book> lisbk) {
if (lisbk.isEmpty() || lisbk == null) {
System.out.println("没有数据");
return;
}
for (Book book : lisbk) {
System.out.println("Id: " + book.getId() + " userName: " + book.getUserName() + " price: " + book.getProductPrice() + " weight:" + book.getWeight());
}
System.out.println();
return;
}
执行结果如下:

List自定义对象的排序,根据对象的某一列进行排序的更多相关文章
- sort 对多列进行排序
sort -t '\t' -k 3,3 -k 2,2 文件名 # 先对第三列进行排序,然后再对第二列进行排序
- linux sort 多列正排序,倒排序
转载:https://segmentfault.com/a/1190000005713784 sort是在Linux里非常常用的一个命令,管排序 sort将文件的每一行作为一个单位,相互比较,比较原则 ...
- Sort 多列正排序,倒排序
linux sort 多列正排序,倒排序 转自https://segmentfault.com/a/1190000005713784 发布于 2016-06-14 sort是在Linux里非常常用 ...
- HDOJ(HDU) 1862 EXCEL排序(类对象的快排)
Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<= ...
- 按键排序JavaScript对象
问题描述 我需要按键排序JavaScript对象. 因此如下: { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' } 会成为: { 'a' : ' ...
- java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义
package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
- SAP CRM 用户界面对象类型和设计对象
在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...
- MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)
回到目录 我不得不说,mongodb官方驱动在与.net结合上做的不是很好,不是很理想,所以,我决定对它进行了二次封装,这是显得很必然了,每个人都希望使用简单的对象,而对使用复杂,麻烦,容易出错的对象 ...
随机推荐
- Delphi 从一个对象中继承数据和方法
- vue2.0+webpack+vuerouter+vuex+axios构建项目基础
前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...
- idHTTP.Post
procedure TForm4.Button2Click(Sender: TObject); var sResponse: string; EnvStr : TStringStream; begin ...
- pyltp安装
第一步:下载wheel文件 第二步:进入该文件的文件夹 第三步:pip install wheel文件名 注意:python的安装版本必须和pyltp的版本相同,我这版本都是pyhton3.6.之前p ...
- (转)为什么收到三个重复的ACK意味着发生拥塞?
三次重复的ACK,可能是丢包引起的,丢包可能是网络拥塞造成的,也可能是信号失真造成的. 三次重复的ACK,也有可能是乱序引起的,而乱序和网络拥塞没有直接关系. 如果就写这两行,感觉什么都没写,接下来的 ...
- string::begin
iterator begin() noexcept; const_iterator begin() const noexcept; iterator end() noexcept; const_ite ...
- free命令详解-1
free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存以及被内核使用的buffer.我们本篇学习如何使用free命令监控系统的内存情况. 一般使用free –m方式查看内存占用情况( ...
- golang打包和部署到centos7
一.环境说明:VS code 二.编译: set GOOS=linux set GOARCH=amd64 go build -o "packageName" 三.发布 上传到服 ...
- python常用函数拾零
Python常用内置函数总结: 整理过程中参考了runoob网站中python内置函数的相关知识点,特此鸣谢!! 原文地址:http://www.runoob.com/python/python-bu ...
- mysql你问我答
1.尊敬的先生,请您谈谈mysql数据库的引擎 数据库中的表设定了什么存储引擎,那么该表在数据存储方式.数据更新方式.数据查询性能以及是否支持索引等方面就会有不同的“效果”. mysql引擎大致分两类 ...