博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java:集合的自定义多重排序
阅读量:6679 次
发布时间:2019-06-25

本文共 3161 字,大约阅读时间需要 10 分钟。

问题:

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

原始数据:

  [法兰克福/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
airportDic = new HashMap
();15 Map
fsuDic = new HashMap
();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
target = new ArrayList
();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
{53 54 Map
airportMap;55 Map
fsuMap;56 57 public FsuComparator(Map
airportMap,58 Map
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 }
View Code

思路:先将"业务排序规则" 转换成 "常规有序规则",然后再利用Comparator接口实现比较

 

转载地址:http://vcnao.baihongyu.com/

你可能感兴趣的文章
感到自己自私和无力
查看>>
更改EMC-Powerpath软件的路径工作模式
查看>>
软件管理
查看>>
[ Talk is Cheap Show me the CODE ] : jQuery Mobile
查看>>
LVM——逻辑卷管理
查看>>
离线安装gcc(CentOS7)
查看>>
客运车辆监管及运营平台
查看>>
eclipse添加注释
查看>>
贝叶斯估计和最大后验估计
查看>>
COBBLER无人值守安装
查看>>
基础知识--JAVA注解ElementType
查看>>
kickstart部署centos6.2 x86_64
查看>>
salt 的用户管理
查看>>
我封装的全文检索之solr篇
查看>>
NFC的第一次接触
查看>>
RHEL7 Connection closed by foreign host.
查看>>
Nodejs开发框架之Loopback介绍
查看>>
微信小程序下拉刷新使用整理
查看>>
ubuntu12.04禁用客人会话
查看>>
我的友情链接
查看>>