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

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

问题:

有一个乱序的对象集合,要求先按对象的属性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<String, Integer> airportDic = new HashMap<String, Integer>();
15     Map<String, Integer> fsuDic = new HashMap<String, Integer>();
16 
17     @Test
18     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相同,则比较FSUCode
70             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接口实现比较

 

目录
相关文章
|
3月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
274 100
|
3月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
307 101
|
3月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
2月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
123 4
|
2月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
111 7
|
4月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
306 23
|
3月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
4月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
4月前
|
Java 数据库 C++
Java异常处理机制:try-catch、throws与自定义异常
本文深入解析Java异常处理机制,涵盖异常分类、try-catch-finally使用、throw与throws区别、自定义异常及最佳实践,助你写出更健壮、清晰的代码,提升Java编程能力。
|
4月前
|
存储 NoSQL Java
Java Stream API:集合操作与并行处理
Stream API 是 Java 8 提供的集合处理工具,通过声明式编程简化数据操作。它支持链式调用、延迟执行和并行处理,能够高效实现过滤、转换、聚合等操作,提升代码可读性和性能。