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

Posted 念欲似毒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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对象的定制化多规则排序,具体实现根据需求来决定。

以上是关于JAVA实现根据对象的属性排序--BeanComparator,FixedOrderComparator,ComparatorChain的主要内容,如果未能解决你的问题,请参考以下文章

Python入门题045:根据对象属性进行排序

java 集合存储对象且根据对象属性排序

C# list<>根据对象的某个属性排序

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

List集合根据存储对象的属性字段排序实现

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