在工作中,经常需要对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自定义对象的排序,根据对象的某一列进行排序的更多相关文章

  1. sort 对多列进行排序

    sort -t '\t' -k 3,3 -k 2,2 文件名  # 先对第三列进行排序,然后再对第二列进行排序

  2. linux sort 多列正排序,倒排序

    转载:https://segmentfault.com/a/1190000005713784 sort是在Linux里非常常用的一个命令,管排序 sort将文件的每一行作为一个单位,相互比较,比较原则 ...

  3. Sort 多列正排序,倒排序

    linux sort 多列正排序,倒排序 转自https://segmentfault.com/a/1190000005713784  发布于 2016-06-14  sort是在Linux里非常常用 ...

  4. HDOJ(HDU) 1862 EXCEL排序(类对象的快排)

    Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<= ...

  5. 按键排序JavaScript对象

    问题描述 我需要按键排序JavaScript对象. 因此如下: { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' } 会成为: { 'a' : ' ...

  6. java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义

    package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...

  7. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  8. SAP CRM 用户界面对象类型和设计对象

    在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...

  9. MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)

    回到目录 我不得不说,mongodb官方驱动在与.net结合上做的不是很好,不是很理想,所以,我决定对它进行了二次封装,这是显得很必然了,每个人都希望使用简单的对象,而对使用复杂,麻烦,容易出错的对象 ...

随机推荐

  1. Mysql(五):索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  2. tensorflow保存数据为.pb格式和加载pb文件

    转自:https://blog.csdn.net/u014264373/article/details/79943389 https://blog.csdn.net/fu6543210/article ...

  3. easyUI 布局

    Layout(布局) 布局容器有5个区域:北.南.东.西和中间.中间区域面板是必须的,边缘的面板都是可选的. 每个边缘区域面板都可以通过拖拽其边框改变大小,也可以点击折叠按钮将面板折叠起来.布局可以进 ...

  4. 判断一个python字符串中是否包含中文字符

    #在python中一个汉字算一个字符,一个英文字母算一个字符 #用 ord() 函数判断单个字符的unicode编码是否大于255即可. def is_contain_chinese(check_st ...

  5. 百度人脸识别java html5

    1.前端thymeleaf+h5 index.html    人脸识别+定位,用的百度sdk <!DOCTYPE html> <html xmlns="http://www ...

  6. HashMap源码分析二

    jdk1.2中HashMap的源码和jdk1.3中HashMap的源码基本上没变.在上篇中,我纠结的那个11和101的问题,在这边中找到答案了.   jdk1.2   public HashMap() ...

  7. ibatis查询列表跟总记录,都引用相同SQL

    在查询记录集合跟查询记录总记录数的时候,我们需要所写的SQL要一样,那么可以都引用同一个SQL.写法如下: <sqlMap namespace="Server"> &l ...

  8. spring容器的refresh方法分析

    spring源码版本5.0.5 Spring容器创建之后,会调用它的refresh方法刷新Spring应用的上下文. 首先整体查看AbstractApplicationContext#refresh源 ...

  9. C语言位运算题解

    #include <stdio.h> #include <stdlib.h> #include <string.h> //#define NONBLANK 1 ma ...

  10. PHP mysqli_fetch_lengths() 函数

    mysqli_fetch_lengths() 函数返回结果集中的字段长度. <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_con ...