问题:
有一个乱序的对象集合,要求先按对象的属性A排序(排序规则由业务确定,非A-Z或0-9的常规顺序),相同A属性的记录,按根据属性B排序(排序规则,同样由业务确定,非常规顺序) -前提:业务规则是明确的
示例:
FSUData对象定义
1 package acc.test; 2 3 public class FSUData { 4 5 public FSUData(String airport, String fsuCode) { 6 this.airport = airport; 7 this.fsuCode = fsuCode; 8 } 9 10 /**11 * 航站12 */13 private String airport;14 15 /**16 * FSU状态节点17 */18 private String fsuCode;19 20 public String getAirport() {21 return airport;22 }23 24 public void setAirport(String airport) {25 this.airport = airport;26 }27 28 public String getFsuCode() {29 return fsuCode;30 }31 32 public void setFsuCode(String fsuCode) {33 this.fsuCode = fsuCode;34 }35 36 public String toString() {37 return airport + "/" + fsuCode;38 }39 40 }
原始数据:
[法兰克福/RCF, 法兰克福/DLV, 成都/DEP, 成都/RCS, 上海/DEP, 上海/RCF]
业务规则:
航站排序规则:成都 -> 上海 -> 法兰克福
FSU排序规则:RCS -> RCF -> TFD -> DEP -> DLV
要求排序后变成下面这样:
[成都/RCS, 成都/DEP, 上海/RCF, 上海/DEP, 法兰克福/RCF, 法兰克福/DLV]
java代码:
1 package acc.test; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 import java.util.HashMap; 7 import java.util.List; 8 import java.util.Map; 9 10 import org.junit.Test;11 12 public class FSUSortTest {13 14 Map<String, Integer> airportDic = new HashMap<String, Integer>();15 Map<String, Integer> fsuDic = new HashMap<String, Integer>();16 17 @Test18 public void test() {19 20 // 先定义顺序规则21 airportDic.put("成都", 1);22 airportDic.put("上海", 2);23 airportDic.put("法兰克福", 3);24 25 fsuDic.put("RCS", 1);26 fsuDic.put("RCF", 2);27 fsuDic.put("TFD", 3);28 fsuDic.put("DEP", 4);29 fsuDic.put("DLV", 5);30 31 // 建一个待排序的目标"数组"32 List<FSUData> target = new ArrayList<FSUData>();33 34 target.add(new FSUData("法兰克福", "RCF"));35 target.add(new FSUData("法兰克福", "DLV"));36 37 target.add(new FSUData("成都", "DEP"));38 target.add(new FSUData("成都", "RCS"));39 40 target.add(new FSUData("上海", "DEP"));41 target.add(new FSUData("上海", "RCF"));42 43 System.out.println("排序前:" + target);44 45 // 排序46 FsuComparator fsuComparator = new FsuComparator(airportDic, fsuDic);47 Collections.sort(target, fsuComparator);48 49 System.out.println("排序后:" + target);50 }51 52 private class FsuComparator implements Comparator<FSUData> {53 54 Map<String, Integer> airportMap;55 Map<String, Integer> fsuMap;56 57 public FsuComparator(Map<String, Integer> airportMap,58 Map<String, Integer> fsuMap) {59 this.airportMap = airportMap;60 this.fsuMap = fsuMap;61 }62 63 public int compare(FSUData s1, FSUData s2) {64 65 // 从顺序规则Map里,取出"排序值"66 Integer airportOrder1 = airportMap.get(s1.getAirport());67 Integer airportOrder2 = airportMap.get(s2.getAirport());68 69 // 如果Airport相同,则比较FSUCode70 if (airportOrder1 == airportOrder2) {71 Integer fsuOrder1 = fsuMap.get(s1.getFsuCode());72 Integer fsuOrder2 = fsuMap.get(s2.getFsuCode());73 return fsuOrder1.compareTo(fsuOrder2);74 }75 76 return airportOrder1.compareTo(airportOrder2);77 }78 }79 80 }
思路:先将"业务排序规则" 转换成 "常规有序规则",然后再利用Comparator接口实现比较
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦