JAVA实现根据对象的属性排序--BeanComparator,FixedOrderComparator,ComparatorChain

最近看到这样一段排序的代码。

public  static List<?> getBrandOrderList(List<?> list, String Field) {
        String[] brandArr = {"7天", "7天优品", "IU", "派", "麗枫", "喆啡", "希岸", "欢朋", "潮漫", "ZMAX", "非繁&城品"};
        Comparator typeComparator = new FixedOrderComparator(brandArr);
        Comparator indexTypeComparator = new BeanComparator(Field, typeComparator);
        Collections.sort(list, indexTypeComparator);
        return list;
    }

后来了解到,这段代码是为了实现:对传入的列表list按照对象的属性Field排序,而顺序要和数组brandArr一致。

首先,我们常常会遇到需要对javaBean排序的情况,如果是对javaBean的单一属性排序,可以直接使用BeanComparator实现自然排序(根据ASCII码排序)

代码入下:

1 List<Student> list = new ArrayList<>();
2         list.add(new Student("张三",1));
3         list.add(new Student("王五",1));
4         list.add(new Student("李四",1));
5         list.add(new Student("赵六",1));
6         System.out.println(list);
7         BeanComparator beanComparator = new BeanComparator("name");
8         Collections.sort(list,beanComparator);
9         System.out.println(list);

运行结果如下:

[Student(name=张三, age=1), Student(name=王五, age=1), Student(name=李四, age=1), Student(name=赵六, age=1)]

排序后:

[Student(name=张三, age=1), Student(name=李四, age=1), Student(name=王五, age=1), Student(name=赵六, age=1)]

这里有一个非常巧合的事情,就是根据ASCII排序,张 李 王 赵是顺序排列的。

但是这里有一定的限制,传入的排序字段必须存在,并且要提供get方法。还有就是只能对单个属性排序,如果要对多个属性排序,仅仅使用BeanComparator是不能完成的。具体的解决方案后边会提到。

而工作中往往会有定制化的需求,那如果要对对象按照指定的顺序排序,就需要FixedOrderComparator实现定制化的排序规则。

 1 List<Student> list = new ArrayList<Student>(){
 2             {
 3                 add(new Student("张三",28));
 4                 add(new Student("王五",23));
 5                 add(new Student("李四",26));
 6                 add(new Student("赵六",17));
 7             }
 8         };
 9         //指定排序规则,参数可以使集合,数组或可变参数
10         FixedOrderComparator fixedOrderComparator = new FixedOrderComparator("张三","李四","王五","赵六");
11         //将要排序的属性,和自定义排序规则传入
12         BeanComparator beanComparator = new BeanComparator("name",fixedOrderComparator);
13         //排序操作
14         Collections.sort(list,beanComparator);
15         System.out.println(list);

输出:

[Student(name=张三, age=28), Student(name=李四, age=26), Student(name=王五, age=23), Student(name=赵六, age=17)]

这也就是开头提到的例子实现的功能。

另外,如果要实现多元素排序,需要用到ComparatorChain

 1 List<Student> list = new ArrayList<Student>(){
 2             {
 3                 add(new Student("张三",28));
 4                 add(new Student("王五",23));
 5                 add(new Student("李四",26));
 6                 add(new Student("李四",23));
 7                 add(new Student("赵六",17));
 8             }
 9         };
10         ComparatorChain comparatorChain = new ComparatorChain();
11         //按照名称排序
12         FixedOrderComparator nameComparator = new FixedOrderComparator("张三","李四","王五","赵六");
13         BeanComparator nameBeanComparator = new BeanComparator("name",nameComparator);
14         //按照年龄排序
15         FixedOrderComparator ageComparator = new FixedOrderComparator(28,26,23,17);
16         BeanComparator ageBeanComparator = new BeanComparator("age",ageComparator);
17         //加入排序规则
18         comparatorChain.addComparator(nameBeanComparator);
19         comparatorChain.addComparator(ageBeanComparator);
20         //排序操作
21         Collections.sort(list,comparatorChain);
22         System.out.println(list);

输出:

[Student(name=张三, age=28), Student(name=李四, age=26), Student(name=李四, age=23), Student(name=王五, age=23), Student(name=赵六, age=17)]

可以看到,在名称排序相同的情况下,李四是按照26在前,23在后的顺序排列的

其中的坑:

  1.对象属性提供get方法

  2.如果要实现定制化排序,定制化的排序规则中,必须要包含所有排序列可能出现的值(比如说:集合中出现的所有age值,在new FixedOrderComparator(28,26,23,17)中必须全部出现,否则会出现java.lang.IllegalArgumentException: Attempting to compare unknown object xx这样的报错。

总之,通过这三个对象,可以实现Bean对象的定制化多规则排序,具体实现根据需求来决定。

原文地址:https://www.cnblogs.com/nysd/p/12600363.html

时间: 2024-10-14 19:18:05

JAVA实现根据对象的属性排序--BeanComparator,FixedOrderComparator,ComparatorChain的相关文章

java 对list中对象按属性排序

实体对象类 --略 排序类----实现Comparator接口,重写compare方法 package com.tang.list; import java.util.Comparator; public class Mycompera implements Comparator<Student> { @Override    public int compare(Student o1, Student o2) {        if (o1.getSid() > o2.getSid()

通用对象按属性排序功能

通用对象按属性排序类 CompareUtil.java public class CompareUtil<T> implements Comparator<T> { private ArrayList<SortItem> sortItemList = new ArrayList<SortItem>(); private class SortItem { public String fieldName; public String sortType; publ

javascript: object对象按属性排序的方法

javascript中在使用ajax和服务端交互时会遇到这样的场景,服务端返回json格式数据,前端展示时需要对数据进行某种排序,比如升序.降序. 可以利用 sort() 自定义排序规则来实现,例如返回的一段json数据,按照年龄升序排列. 1 var res = { 2 success: true, 3 result: [ 4 { 5 id: 1, 6 name: 'Jack', 7 age: 21 8 }, 9 { 10 id: 2, 11 name: 'Tom', 12 age: 23 1

java反射获取对象的属性值和对象属性中的子属性值

近段时间在做web项目,前端使用的是jQuery EasyUI. 为方便需要,准备做一个前端通用的Datagird导出Excel功能,博主也考虑过思路和最终功能,1.前端选中行导出:2.当前页导出:3.当前过滤条件导出. 想偷懒在网上找找已有的代码改改,发现大部分只能满足个别需求,使用JS导出只能满足前端,使用代码才能实现3功能. ...... 好了,说了一堆废话,回归正题,本文是在做通用自定义字段导出时所需要,根据属性名去查找对象和子对象,找到对应属性值,抓取回来放到Excel中. 直接上代码

java 中根据类的属性排序

1 package edu.del; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.List; 6 import java.util.Scanner; 7 8 class Student implements Comparable<Student>{ 9 String name; 10 int score; 11 12 public Student(String name,

java List按照对象的属性进行分组

一.问题背景 在java的开发过程中,我们往往也需要用对象进行分组进行处理,如何对List进行分组呢?以下我们简单高效的实现分组 二.问题解决 1 //以下WarehouseDeliveryTimeVO的列表中对其属性logisticsModel(物流模式)进行分组,new String[]{}可以按照多个属性进行分组,allTimeVO为其对象列表 2 Map<String,List<WarehouseDeliveryTimeVO>> logisticsModelGoodsMap

根据对象的属性排序数组

根据对象的年龄排序. var boy = [{ name: "jiang", age: 22 }, { name: "AAAAAAAAAAAAAA", age: 21 }, { name: "CCCCCCCCc", age: 25 }]; function compare(propertyName) { return function(object1, object2) { var value1 = object1[propertyName];

java集合中对象某属性比较排序Comparable与Comparator

要对集合中的对象的某属性进行排序有两种方式. a. 一种是要排序对象类实现comparable接口的compareTo方法:然后把对象放入list:然后调用Collections.sort(list);b. 一种是不对要排序对象类做任何改动,创建Comparator接口的实现类C:然后 把对象放入list:然后调用Collections.sort(list, C); a.eg ---------------------------------- 1 public class User imple

java根据list中的对象某个属性排序

public class Test { public static void main(String[] args) throws Exception { CityModel city1 = new CityModel(); city1.setCity_code(1); CityModel city2 = new CityModel(); city2.setCity_code(1); CityModel city3 = new CityModel(); city3.setCity_code(1)