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结合上做的不是很好,不是很理想,所以,我决定对它进行了二次封装,这是显得很必然了,每个人都希望使用简单的对象,而对使用复杂,麻烦,容易出错的对象 ...
随机推荐
- SqlServer和Oralce保留几位小数以及当末尾小数为0也显示
需求描述:对数字类型值保留2位小数,当2位小数末尾出现0时也显示 SqlServer处理方法: 1.首先通过Round函数保留2位有效数字,多出的位数值变成0 2.通过Cast函数转成decimal( ...
- 第一节:python读取excel文件
写在前面: (1)Excel中数字格式int(1),读出的是float(1.0)类型,导致传参时造成不同,强制转换时,int(str(1.0))在2.7版本又会报错ValueError: invali ...
- P5496 【模板】回文自动机(PAM)
做一下强制在线处理即可 #include <cstdio> #include <algorithm> #include <cstring> using namesp ...
- linux学习19 shell脚本基础-bash脚本编程基础及配置文件
一.shell脚本编程 1.编程语言的分类,根据运行方式 a.编译运行:源代码 --> 编译器(编译) --> 程序文件 C语言: b.解释运行:源代码 --> 运行时启动解释器,由 ...
- win10 LTSC 2019 激活
win 10 打开终端 1.slmgr -ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D 2.slmgr -skms kms.03k.org 3.slmgr -ato 4. slm ...
- vscode+TCC快捷编译c语言
1.安装vscode. 2.安装插件tcc.小巧,快速,符合ansi c, 法国大神级别程序员开发的编译器. 3.编写C代码,F10运行,即可得结果,对于验证一些语法很快捷,很方便.只需三步!!
- BZOJ 4147: [AMPPZ2014]Euclidean Nim (分类讨论博弈神题)
orz PoPoQQQ神犇,每一篇题解都写得很清楚 (看了PoPoQQQ的哲♂学三部曲,瑟瑟发抖) CODE #include <cstdio> #include <algorith ...
- Leetcode部分题目整理(Javascript)
3.无重复字符的最长子串 /** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s ...
- could not load file or assembly "System.Web.Mvc...
1.一般出现这个错误是因为Web.Config里面的版本号跟project用到的dll版本对应不上 更改webconfig <add assembly="System.Web.Mvc, ...
- 洛谷P2622 关灯问题II
洛谷题目链接 声明: 本篇文章不讲基础,对萌新不太友好,(我就是萌新),要学状压$dp$的请另寻,这篇文章只是便于本人查看.... 首先看到$n<=10$,就可以考虑状压了,要求最小值,所以初始 ...