在工作中,经常需要对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. XXX_initcall()函数分析

    1. 先看这些宏的定义(定义在文件include/linux/init.h中) #define pure_initcall(fn) __define_initcall("0",fn ...

  2. TensorFlow指定GPU/CPU进行训练和输出devices信息

    TensorFlow指定GPU/CPU进行训练和输出devices信息 1.在tensorflow代码中指定GPU/CPU进行训练 with tf.device('/gpu:0'): .... wit ...

  3. PAT Basic 1072 开学寄语 (20 分)

      下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智. ...

  4. 4.caffe资源汇总(更新中)

    学习需要更新,网上有一些非常不错博客. 感谢这些博主,他们都很认真. 00.tornadomeet 0.denny的学习专栏 1.xizero00 2.lingerlanlan 3.iamzhangz ...

  5. SQL Server 元数据分类

    SQL Server 中维护了一组表用于存储 SQL Server 中所有的对象.数据类型.约束条件.配置选项.可用资源等信息,这些信息称为元数据信息(Metadata),而这些表称为系统基础表(Sy ...

  6. 深度排序模型概述(二)PNN/NFM/AFM

    在CTR预估中,为了解决稀疏特征的问题,学者们提出了FM模型来建模特征之间的交互关系.但是FM模型只能表达特征之间两两组合之间的关系,无法建模两个特征之间深层次的关系或者说多个特征之间的交互关系,因此 ...

  7. ajax的底层实现

    Ajax 技术核心是 XMLHttpRequest 对象(简称 XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现.在 XHR 出现之前,Ajax 式的通信必须借助一些手段 ...

  8. EasyUi Datagrid中footer renderFooter

    默认的'rowStyler' 选项不支持footer,想让footer支持rowStyler的话,dategird就得重写.代码如下. var myview = $.extend({}, $.fn.d ...

  9. 学习elasticsearch(一)linux环境搭建(3)——head插件安装

    对于5.x的es,head插件不支持 ./elasticearch-plugin install [plugin_name]方式安装. 进入正文 1.首先确保你的机器安装了python,如果没有,请看 ...

  10. JS数组的交集、并集、差集,数组去重,获取两个数组重复的元素,去除两个数组相同的元素

    let arr1=[1,2,3,4,5,6] let arr2=[4,5,6,7,8,9] // 并集 数组去重 let RemoveSame=[...new Set([...arr1,...arr2 ...