zoukankan      html  css  js  c++  java
  • List自定义对象的排序,根据对象的某一列进行排序

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

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

    1、存在实体类:

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

    2、SortList  排序实现通用类:

     1 @Data
     2 @AllArgsConstructor
     3 @NoArgsConstructor
     4 public class SortList<T> implements Comparator<T> {
     5 
     6     //需要比较的对象属性字段名称
     7     private String  propertyName;
     8     //是否是升序排序
     9     private boolean isAsc;
    10 
    11     /**
    12      * 需要的是:根据类中的字段对对象进行排序
    13      *
    14      * @return
    15      */
    16 
    17     @Override
    18     public int compare(T b1, T b2) {
    19 
    20         Class<?> clz = b1.getClass();
    21         Method method = getPropertyMethod(clz, propertyName);
    22         try {
    23 
    24             Object objectOne = method.invoke(b1);
    25 
    26             Object objectTwo = method.invoke(b2);
    27 
    28             if (objectOne == null || objectTwo == null) {
    29                 return 0;
    30             }
    31 
    32             Comparable value1 = (Comparable) objectOne;
    33 
    34             Comparable value2 = (Comparable) objectTwo;
    35 
    36             if (isAsc) {
    37                 return value1.compareTo(value2);
    38             } else {
    39                 return value2.compareTo(value1);
    40             }
    41         } catch (Exception e) {
    42             e.printStackTrace();
    43         }
    44         return 0;
    45     }
    46 
    47     // 获取类名
    48     public static Method getPropertyMethod(Class clz, String propertyName) {
    49         Method method = null;
    50         try {
    51             method = clz.getMethod("get" + firstUpperCase(propertyName));
    52         } catch (Exception e) {
    53             System.out.println("获取类名发生错误!");
    54         }
    55         return method;
    56     }
    57 
    58     /**
    59      * 首字母大写方法
    60      * @param str
    61      * @return
    62      */
    63     public static String firstUpperCase(String str) {
    64         char[] ch = str.toCharArray();
    65         if (ch[0] >= 'a' && ch[0] <= 'z') {
    66             ch[0] = (char) (ch[0] - 32);
    67         }
    68         return new String(ch);
    69     }
    70 
    71 }

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

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

    测试

     1 @Test
     2     public void sortBook() {
     3         List<Book> bookList = getBookList();
     4         System.out.println("原先的顺序:");
     5         printf(bookList);
     6 
     7         System.out.println("根据价格排序:");
     8         Collections.sort(bookList, new SortList<Book>("productPrice",true));
     9         printf(bookList);
    10 
    11         System.out.println("根据Id排序:");
    12         Collections.sort(bookList, new SortList<Book>("id",false));
    13         printf(bookList);
    14 
    15         System.out.println("根据weight排序:");
    16         Collections.sort(bookList, new SortList<Book>("weight",true));
    17         printf(bookList);
    18 
    19         System.out.println("根据userName排序:");
    20         Collections.sort(bookList, new SortList<Book>("userName",true));
    21         printf(bookList);
    22 
    23 
    24     }
    25 
    26     public List<Book> getBookList() {
    27         List<Book> books = Lists.newArrayList();
    28         Book book1 = new Book(1L, "first", 10.00, "zhangsan", 19);
    29         Book book2 = new Book(2L, "wirst", 9.00, "zhangsan", 24);
    30         Book book3 = new Book(3L, "eirst", 8.00, "zhangsan", 29);
    31         Book book4 = new Book(4L, "girst", 7.00, "zhangsan", 13);
    32         Book book5 = new Book(5L, "tirst", 6.00, "zhangsan", 14);
    33 
    34         books.add(book1);
    35         books.add(book2);
    36         books.add(book3);
    37         books.add(book4);
    38         books.add(book5);
    39 
    40         return books;
    41     }
    42 
    43     /**
    44      * 打印函数
    45      *
    46      * @param lisbk
    47      */
    48     public void printf(List<Book> lisbk) {
    49         if (lisbk.isEmpty() || lisbk == null) {
    50             System.out.println("没有数据");
    51             return;
    52         }
    53         for (Book book : lisbk) {
    54             System.out.println("Id: " + book.getId() + "   userName: " + book.getUserName() + "   price: " + book.getProductPrice() + "  weight:" + book.getWeight());
    55         }
    56         System.out.println();
    57         return;
    58     }

    执行结果如下:

  • 相关阅读:
    android studio中timber的配置
    bufferknife框架的正确使用方式 -终于他么知道了
    开源的图像滤镜库----for Android
    HSV做通道分离是出现的Vector内存越界错误
    HSV与RGB的相互转换的公式
    Windows下python的第三方库的安装
    Python出现"Non-ASCII character 'xe6' in file"错误解决方法
    Verilog的IDE Quartus II
    Java-ZipUtil工具类
    Java-JDBCUtil工具类
  • 原文地址:https://www.cnblogs.com/yinfengjiujian/p/11758524.html
Copyright © 2011-2022 走看看