java:集合的自定义多重排序
2014-10-13 15:15
127 查看
问题:
有一个乱序的对象集合,要求先按对象的属性A排序(排序规则由业务确定,非A-Z或0-9的常规顺序),相同A属性的记录,按根据属性B排序(排序规则,同样由业务确定,非常规顺序) -前提:业务规则是明确的
示例:
FSUData对象定义
View Code
思路:先将"业务排序规则" 转换成 "常规有序规则",然后再利用Comparator接口实现比较
有一个乱序的对象集合,要求先按对象的属性A排序(排序规则由业务确定,非A-Z或0-9的常规顺序),相同A属性的记录,按根据属性B排序(排序规则,同样由业务确定,非常规顺序) -前提:业务规则是明确的
示例:
FSUData对象定义
package acc.test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; public class FSUSortTest { Map<String, Integer> airportDic = new HashMap<String, Integer>(); Map<String, Integer> fsuDic = new HashMap<String, Integer>(); @Test public void test() { // 先定义顺序规则 airportDic.put("成都", 1); airportDic.put("上海", 2); airportDic.put("法兰克福", 3); fsuDic.put("RCS", 1); fsuDic.put("RCF", 2); fsuDic.put("TFD", 3); fsuDic.put("DEP", 4); fsuDic.put("DLV", 5); // 建一个待排序的目标"数组" List<FSUData> target = new ArrayList<FSUData>(); target.add(new FSUData("法兰克福", "RCF")); target.add(new FSUData("法兰克福", "DLV")); target.add(new FSUData("成都", "DEP")); target.add(new FSUData("成都", "RCS")); target.add(new FSUData("上海", "DEP")); target.add(new FSUData("上海", "RCF")); System.out.println("排序前:" + target); // 排序 FsuComparator fsuComparator = new FsuComparator(airportDic, fsuDic); Collections.sort(target, fsuComparator); System.out.println("排序后:" + target); } private class FsuComparator implements Comparator<FSUData> { Map<String, Integer> airportMap; Map<String, Integer> fsuMap; public FsuComparator(Map<String, Integer> airportMap, Map<String, Integer> fsuMap) { this.airportMap = airportMap; this.fsuMap = fsuMap; } public int compare(FSUData s1, FSUData s2) { // 从顺序规则Map里,取出"排序值" Integer airportOrder1 = airportMap.get(s1.getAirport()); Integer airportOrder2 = airportMap.get(s2.getAirport()); // 如果Airport相同,则比较FSUCode if (airportOrder1 == airportOrder2) { Integer fsuOrder1 = fsuMap.get(s1.getFsuCode()); Integer fsuOrder2 = fsuMap.get(s2.getFsuCode()); return fsuOrder1.compareTo(fsuOrder2); } return airportOrder1.compareTo(airportOrder2); } } }
View Code
思路:先将"业务排序规则" 转换成 "常规有序规则",然后再利用Comparator接口实现比较
相关文章推荐
- Java自定义对象数组、集合排序
- Java 往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序。
- java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)
- Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序)
- java集合 自定义排序
- Java_浅谈集合中自定义元素排序方式
- Java基础知识强化之集合框架笔记69:Collections类之ArrayList存储自自定义对象并排序的案例
- java、scala集合自定义排序异常:Comparison method violates its general contract!
- java 自定义对象集合排序
- Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序)
- java编程排序之自定义类型的集合,按业务需求排序
- Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法
- java 集合中自定义对象的几种排序方法
- 自定义java排序
- 自定义集合具有排序功能。像datatable
- [基础回顾-JAVA类集框架篇] 之 集合排序Comparable与Comparator(下)
- Java集合对象排序测试
- 对于集合内装载的对象数据进行自定义排序 !
- java Lucene 中自定义排序的实现
- java集合中对象排序