为了账号安全,请及时绑定邮箱和手机立即绑定

java:集合的自定义多重排序

标签:
Java

问题:

有一个乱序的对象集合,要求先按对象的属性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 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消