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接口实现比较

 

目录
相关文章
|
20天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
34 3
|
20天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
31 2
|
5天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
5天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
5天前
|
Java 开发者
|
17天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
46 5
|
18天前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
46 3
|
20天前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
24 2
|
4天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
7 0
|
9天前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
17 0
下一篇
无影云桌面