JAVA实现根据对象的属性排序--BeanComparator,FixedOrderComparator,ComparatorChain
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA实现根据对象的属性排序--BeanComparator,FixedOrderComparator,ComparatorChain,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3334字,纯文字阅读大概需要5分钟。
内容图文
![JAVA实现根据对象的属性排序--BeanComparator,FixedOrderComparator,ComparatorChain](/upload/InfoBanner/zyjiaocheng/1331/12e2b6aea7034bcb9daced404a0bd6e2.jpg)
最近看到这样一段排序的代码。
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
内容总结
以上是互联网集市为您收集整理的JAVA实现根据对象的属性排序--BeanComparator,FixedOrderComparator,ComparatorChain全部内容,希望文章能够帮你解决JAVA实现根据对象的属性排序--BeanComparator,FixedOrderComparator,ComparatorChain所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。