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

问题:

有一个乱序的对象集合,要求先按对象的属性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接口实现比较

 

时间: 2024-11-13 06:43:29

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

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

引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不停的重复.一直相信,在你不知道要干嘛的时候,浮躁的时候,不如回到最基础的东西上,或许换种思考方式,会有不一样的收获. 泛型集合List<T>排序 先看一个简单的例子,int类型的集合: 1 using System; 2 using System.Collections.Generic; 3 us

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

Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优化. 1.使用Arrays对数组进行排序 Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法. (1)使用Arrays排序 Arrays使用非常简单,直接调用sort()即可: 1 2 3 4 5 6 7 8 9 10 11 int[] arr = new i

solr入门之edismax权重排序使用之Java代码实现自定义权重

package com.git.edismax;   import java.io.IOException;      import org.apache.solr.client.solrj.SolrClient;   import org.apache.solr.client.solrj.SolrQuery;   import org.apache.solr.client.solrj.SolrServerException;   import org.apache.solr.client.so

用Java集合中的Collections.sort方法如何对list排序(两种方法)_java

第一种是list中的对象实现Comparable接口,如下: /** * 根据order对User排序 */ public class User implements Comparable <user> { private String name; private Integer order; public String getName() { return name; } public void setName(String name) { this.name = name; } publi

java 集合 Connection 栈 队列 及一些常用

集合家族图 ---|Collection: 单列集合            ---|List: 有存储顺序, 可重复               ---|ArrayList:    数组实现, 查找快, 增删慢                                        ---|LinkedList:   链表实现, 增删快, 查找慢  实现了 栈 队列                                      ---|Vector:   和ArrayList原

关于Java集合框架面试题(含答案)下_java

21.HashMap和HashTable有何不同? (1)HashMap允许key和value为null,而HashTable不允许. (2)HashTable是同步的,而HashMap不是.所以HashMap适合单线程环境,HashTable适合多线程环境. (3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的. (4)HashMap

浅谈Java之Map 按值排序 (Map sort by value)_java

Map是键值对的集合,又叫作字典或关联数组等,是最常见的数据结构之一.在java如何让一个map按value排序呢? 看似简单,但却不容易! 比如,Map中key是String类型,表示一个单词,而value是int型,表示该单词出现的次数,现在我们想要按照单词出现的次数来排序: Map map = new TreeMap(); map.put("me", 1000); map.put("and", 4000); map.put("you", 3

基于java集合中的一些易混淆的知识点(详解)_java

(一) collection和collections 这两者均位于java.util包下,不同的是: collection是一个集合接口,有ListSet等常见的子接口,是集合框架图的第一个节点,,提供了对集合对象进行基本操作的一系列方法. 常见的方法有: boolean add(E e) 往容器中添加元素:int size() 返回collection的元素数:boolean isEmpty() 判断此容器是否为空: boolean contains(Object o) 如果此collecti

Java集合框架List,Map,Set等全面介绍

Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构.   Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +--java.util.LinkedList [C]   +--java.util.Vector [C]      +--java.util.Stack [C]+--ja