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

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

public static List> getBrandOrderList(List>list, String Field) {

String[] brandArr= {"7天", "7天优品", "IU", "派", "麗枫", "喆啡", "希岸", "欢朋", "潮漫", "ZMAX", "非繁&城品"};

Comparator typeComparator= newFixedOrderComparator(brandArr);

Comparator indexTypeComparator= newBeanComparator(Field, typeComparator);

Collections.sort(list, indexTypeComparator);returnlist;

}

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

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

代码入下:

1 List 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 list = new ArrayList(){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 list = new ArrayList(){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 = newComparatorChain();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对象的定制化多规则排序,具体实现根据需求来决定。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值