java:集合的自定义多重排序
问题:
有一个乱序的对象集合,要求先按对象的属性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:集合的自定义多重排序的更多相关文章
- Java,集合按自定义规则排序
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...
- [c#基础]泛型集合的自定义类型排序
引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...
- C# 泛型集合的自定义类型排序
一.泛型集合List<T>排序 经sort方法之后,采用了升序的方式进行排列的. List<int> list = new List<int>() { 2, 4, ...
- [java]三种自定义链表排序方式
代码: import java.util.ArrayList; import java.util.Comparator; import java.util.List; class Emp{ Strin ...
- Java集合框架实现自定义排序
Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...
- JAVA集合四:比较器--类自定义排序
参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...
- Java集合排序(面试必考点之一)
集合是Java面试必考知识点,而集合的排序也是非常重要的,工作中经常用到,那么这个知识点也是必须要掌握的,下面是我曾经面试时被面试官问的问题: 根据API可知,Java集合的工具类Collection ...
- java集合进行排序的两种方式
java集合的工具类Collections中提供了两种排序的方法,分别是: Collections.sort(List list) Collections.sort(List list,Compara ...
- Java集合框架和数组的排序(转载)
Java集合框架(*Collection)*和数组的排序 根据约定,在使用java编程的时候应尽可能的使用现有的类库,当然你也可以自己编写一个排序的方法,或者框架,但是有几个人能写得比JDK里的还 ...
随机推荐
- redis使用笔记
mysql---select * from table where xx;insert into table(name1,name2..) values(value1,value2);delete f ...
- [MySQL Reference Manual] 7 备份和恢复
7. 备份和恢复 本章主要会介绍: 1.备份的类型:逻辑备份,物理备份,全备和增量4种 2.创建备份的方法 3.还原方法,包括还原到时间点 4.备份计划,压缩和加密 5.表维护,恢复损坏的表 7. 备 ...
- JS代码判断字符串中有多少汉字
$("form").submit(function () { var content = editor.getContentTxt(); var sum = 0; re = /[\ ...
- SQL Server 用链接服务器 同步MySQL
--测试环境SQL 2014 在MySql环境: use test ; Create Table Demo(ID int,Name varchar(50)) 在控制面板—管理工具—数据源(ODBC)— ...
- InnoDB的WAL方式学习
之前写过一篇博文,<不好的MySQL过程编写习惯>(http://www.cnblogs.com/wingsless/p/5041838.html).这篇博文里强调了不要循环的提交事务,尽 ...
- JVM探索之——内存管理(二)
上篇文章我们介绍了JVM所管理的内存结构也就是运行时数据区(Run-Time Data Areas),现在我们将介绍JVM的内存分配与回收静态内存分配与动态内存分配 JVM的内存分配主要分为两种:静态 ...
- iOS UIButton 图片文字上下垂直布局 解决方案
实现如图所示效果: 这是一个UIButton,需要改变image和title相对位置. 解决如下: //设置文字偏移:向下偏移图片高度+向左偏移图片宽度 (偏移量是根据[图片]大小来的,这点是关键)b ...
- 使用.Net自带的GZipStream进行流压缩与解压
using System.IO; using System.IO.Compression; using System.Text; namespace CS.Utility { /// <summ ...
- CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解[转]
一.前言 IE特有的滤镜常常作为CSS3各种新特性的降级处理补充,而Adobe转向HTML5后与Chrome合作推出CSS3的Filter特性,因此当前仅Webkit内核的浏览器支持CSS3 F ...
- unix automake 使用,快速生成你的Makefile
使用automake快速生成编译的Makefile 1,确保自己装有的软件automake autoconf 2, 1)执行autoscan 并将生成的configure.scan重命名为config ...