List自定义对象的排序,根据对象的某一列进行排序

   在工作中,经常需要对List对象集合进行排序操作,下面总结下搞个通用排序对象,原理是使用JAVA的  

   Comparator    接口实现排序   不多说直接上“干货”

1、存在实体类:

1 1 @Data 2 2 @AllArgsConstructor 3 3 @NoArgsConstructor 4 4 class Book { 5 5 private Long id;//编号 6 6 private String userName;//书本名称 7 7 private double productPrice;//书本价格 8 8 private String author;//作者 9 9 private Integer weight;//权重 1010 }

2、SortList  排序实现通用类:

1 1 @Data 2 2 @AllArgsConstructor 3 3 @NoArgsConstructor 4 4 public class SortList<T> implements Comparator<T> { 5 5 6 6 //需要比较的对象属性字段名称 7 7 private String propertyName; 8 8 //是否是升序排序 9 9 private boolean isAsc; 1010 1111 /** 1212 * 需要的是:根据类中的字段对对象进行排序 1313 * 1414 * @return 1515 */ 1616 1717 @Override 1818 public int compare(T b1, T b2) { 1919 2020 Class<?> clz = b1.getClass(); 2121 Method method = getPropertyMethod(clz, propertyName); 2222 try { 2323 2424 Object objectOne = method.invoke(b1); 2525 2626 Object objectTwo = method.invoke(b2); 2727 2828 if (objectOne == null || objectTwo == null) { 2929 return 0; 3030 } 3131 3232 Comparable value1 = (Comparable) objectOne; 3333 3434 Comparable value2 = (Comparable) objectTwo; 3535 3636 if (isAsc) { 3737 return value1.compareTo(value2); 3838 } else { 3939 return value2.compareTo(value1); 4040 } 4141 } catch (Exception e) { 4242 e.printStackTrace(); 4343 } 4444 return 0; 4545 } 4646 4747 // 获取类名 4848 public static Method getPropertyMethod(Class clz, String propertyName) { 4949 Method method = null; 5050 try { 5151 method = clz.getMethod("get" + firstUpperCase(propertyName)); 5252 } catch (Exception e) { 5353 System.out.println("获取类名发生错误!"); 5454 } 5555 return method; 5656 } 5757 5858 /** 5959 * 首字母大写方法 6060 * @param str 6161 * @return 6262 */ 6363 public static String firstUpperCase(String str) { 6464 char[] ch = str.toCharArray(); 6565 if (ch[0] >= 'a' && ch[0] <= 'z') { 6666 ch[0] = (char) (ch[0] - 32); 6767 } 6868 return new String(ch); 6969 } 7070 7171 }

3、实际使用测试如下:  主要这么来使用   

Collections.sort(bookList, new SortList<Book>("productPrice",true));

测试

1 1 @Test 2 2 public void sortBook() { 3 3 List<Book> bookList = getBookList(); 4 4 System.out.println("原先的顺序:"); 5 5 printf(bookList); 6 6 7 7 System.out.println("根据价格排序:"); 8 8 Collections.sort(bookList, new SortList<Book>("productPrice",true)); 9 9 printf(bookList); 1010 1111 System.out.println("根据Id排序:"); 1212 Collections.sort(bookList, new SortList<Book>("id",false)); 1313 printf(bookList); 1414 1515 System.out.println("根据weight排序:"); 1616 Collections.sort(bookList, new SortList<Book>("weight",true)); 1717 printf(bookList); 1818 1919 System.out.println("根据userName排序:"); 2020 Collections.sort(bookList, new SortList<Book>("userName",true)); 2121 printf(bookList); 2222 2323 2424 } 2525 2626 public List<Book> getBookList() { 2727 List<Book> books = Lists.newArrayList(); 2828 Book book1 = new Book(1L, "first", 10.00, "zhangsan", 19); 2929 Book book2 = new Book(2L, "wirst", 9.00, "zhangsan", 24); 3030 Book book3 = new Book(3L, "eirst", 8.00, "zhangsan", 29); 3131 Book book4 = new Book(4L, "girst", 7.00, "zhangsan", 13); 3232 Book book5 = new Book(5L, "tirst", 6.00, "zhangsan", 14); 3333 3434 books.add(book1); 3535 books.add(book2); 3636 books.add(book3); 3737 books.add(book4); 3838 books.add(book5); 3939 4040 return books; 4141 } 4242 4343 /** 4444 * 打印函数 4545 * 4646 * @param lisbk 4747 */ 4848 public void printf(List<Book> lisbk) { 4949 if (lisbk.isEmpty() || lisbk == null) { 5050 System.out.println("没有数据"); 5151 return; 5252 } 5353 for (Book book : lisbk) { 5454 System.out.println("Id: " + book.getId() + " userName: " + book.getUserName() + " price: " + book.getProductPrice() + " weight:" + book.getWeight()); 5555 } 5656 System.out.println(); 5757 return; 5858 }

执行结果如下:

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java8新特性

Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str

java 数据结构(十二):Collections工具类的使用

Collections工具类1.作用:操作Collection和Map的工具类2.常用方法:reverse(List):反转List中元素的顺序shuffle(List):对List集合元素进行随机排序sort(List):根据元素的自然顺序对指定List集合元素升序排序sort(List,Comparator)

List自定义对象的排序,根据对象的某一列进行排序 - HelloWorld