问题:

有一个乱序的对象集合,要求先按对象的属性A排序(排序规则由业务确定,非A-Z或0-9的常规顺序),相同A属性的记录,按根据属性B排序(排序规则,同样由业务确定,非常规顺序) -前提:业务规则是明确的

示例:

FSUData对象定义

 package acc.test;

 public class FSUData {

     public FSUData(String airport, String fsuCode) {
this.airport = airport;
this.fsuCode = fsuCode;
} /**
* 航站
*/
private String airport; /**
* FSU状态节点
*/
private String fsuCode; public String getAirport() {
return airport;
} public void setAirport(String airport) {
this.airport = airport;
} public String getFsuCode() {
return fsuCode;
} public void setFsuCode(String fsuCode) {
this.fsuCode = fsuCode;
} public String toString() {
return airport + "/" + fsuCode;
} }

原始数据:

[法兰克福/RCF, 法兰克福/DLV, 成都/DEP, 成都/RCS, 上海/DEP, 上海/RCF]

业务规则:

航站排序规则:成都 -> 上海 -> 法兰克福

FSU排序规则:RCS -> RCF -> TFD -> DEP -> DLV

要求排序后变成下面这样:

[成都/RCS, 成都/DEP, 上海/RCF, 上海/DEP, 法兰克福/RCF, 法兰克福/DLV]

java代码:

 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);
}
} }

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

java:集合的自定义多重排序的更多相关文章

  1. Java,集合按自定义规则排序

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  2. [c#基础]泛型集合的自定义类型排序

    引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...

  3. C# 泛型集合的自定义类型排序

    一.泛型集合List<T>排序 经sort方法之后,采用了升序的方式进行排列的. List<int> list = new List<int>() { 2, 4, ...

  4. [java]三种自定义链表排序方式

    代码: import java.util.ArrayList; import java.util.Comparator; import java.util.List; class Emp{ Strin ...

  5. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  6. JAVA集合四:比较器--类自定义排序

    参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...

  7. Java集合排序(面试必考点之一)

    集合是Java面试必考知识点,而集合的排序也是非常重要的,工作中经常用到,那么这个知识点也是必须要掌握的,下面是我曾经面试时被面试官问的问题: 根据API可知,Java集合的工具类Collection ...

  8. java集合进行排序的两种方式

    java集合的工具类Collections中提供了两种排序的方法,分别是: Collections.sort(List list) Collections.sort(List list,Compara ...

  9. Java集合框架和数组的排序(转载)

    Java集合框架(*Collection)*和数组的排序 ​ 根据约定,在使用java编程的时候应尽可能的使用现有的类库,当然你也可以自己编写一个排序的方法,或者框架,但是有几个人能写得比JDK里的还 ...

随机推荐

  1. asp.net mvc 应用Bundle(捆绑和微小)压缩技术 启用 BundleConfig 配置web.config

    从MVC4开始,我们就发现,项目中对Global.asax进行了优化,将原来在MVC3中使用的代码移到了 [App_Start]文件夹下,而Global.asax只负责初始化.其中的BundleCon ...

  2. 查看centos版本号

    --写在开始-- 玩Linux,不同的版本会有一些细微区别: so,经常需要查看服务器版本号: --正文-- 有以下命令可以查看linux服务器版本号: # lsb_release -a LSB Ve ...

  3. Innodb行锁源码学习(一)

    Innodb是mysql数据库中目前最流行的存储引擎,innodb相对其它存储引擎一个很大的特点是支持事务,并且支持行粒度的锁.今天我重点跟大家分享下innodb行锁实现的基础知识.由于篇幅比较大,文 ...

  4. hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句

    package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Query; im ...

  5. SQL Server中的RAND函数的介绍和区间随机数值函数的实现

        工作中会遇到SQL Server模拟数据生成以及数值列值(如整型.日期和时间数据类型)随机填充等等任务,这些任务中都要使用到随机数.鉴于此,本文将对SQL Server中随机数的使用简单做个总 ...

  6. mysql截取longblob类型字段内一小块数据的方法

    由于longblob类型的字段内容一般都好大,最大限制是4G,所以在数据查询中读取一整块数据的方式是不现实的,这需要要截取的方法来获取需要的数据. 方法如下: hex(substring(A, ind ...

  7. 一个有趣的SQL Server 层级汇总数据问题

        看SQL Server大V宋大侠的博客文章,发现了一个有趣的sql server层级汇总数据问题.          具体的问题如下:     parent_id emp_id emp_nam ...

  8. 烂泥:高负载均衡学习haproxy之关键词介绍

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 上一篇文章我们简单讲解了有关haproxy的安装与搭建,在这篇文章我们把haproxy配置文件中使用到的关键词一一介绍下. 关注我微信ilann ...

  9. Windows批处理:自动检查服务器连通性

    该技术与上一篇<自动检查网络连通性>的实现原理相同,我将脚本稍微改动了下,用于检查公司服务器的连通性,简单快捷.在这里附上修改方法. @echo off color 1F title 服务 ...

  10. LINUX下NFS系统的安装配置

    准备:NFS系统服务器IP 192.168.135.1 ,NFS共享目录/mnt/NFS 一.安装NFS 查看nfs是否安装 #rpm -qa | grep nfs 若没有则安装nfs包 #yum i ...