1 importjava.util.ArrayList;2 importjava.util.Collections;3 importjava.util.Comparator;4 importjava.util.HashMap;5 importjava.util.Iterator;6 importjava.util.LinkedHashMap;7 importjava.util.List;8 importjava.util.Map;9 importjava.util.Map.Entry;10 importjava.util.TreeMap;11
12 /**
13 * Map进行多条件排序输出14 * 水果具有好吃不好吃难吃属性。15 * 入口Map16 * 首先按照好吃不好吃难吃排序17 * 然后按照水果的标志Id排序18 * 出口Map19 *20 * 2016年8月14日21 */
22 public classMainSort {23
24 /**
25 * 主方法26 *@paramargs27 */
28 public static voidmain(String[] args) {29 //获取Map
30 Map fruitMap =getFruitMap();31 //打印未排序的Map
32 show(fruitMap);33 System.out.println("-----------before-----------");34 //打印排序完了的Map
35 show(MainSort.sortMapByValue(fruitMap));36 System.out.println("-----------after------------");37 }38
39 /**
40 * 循环打印Map41 */
42 private static void show(MapfruitMap) {43 //循环Map
44 for (Map.EntryfruitOneMap : fruitMap.entrySet()) {45 Fruit fruit =fruitOneMap.getValue();46 System.out.println(fruit.getFruitName() + " " + fruit.getFruitTaste()+ " " +fruit.getId() );47 }48 }49
50 /**
51 * 准备参数52 *@return
53 */
54 private static MapgetFruitMap() {55 Map fruitMap = new TreeMap<>();56
57 //创建对象
58 Fruit b = new Fruit("苹果" , FruitTaste.HAOCHI, "b");59 Fruit a = new Fruit("梨子" , FruitTaste.YIBAN , "a");60 Fruit c = new Fruit("香蕉" , FruitTaste.HAOCHI, "c");61 Fruit d = new Fruit("桃子" , FruitTaste.HAOCHI, "d");62 Fruit e = new Fruit("橘子" , FruitTaste.NANGCHI , "e");63 Fruit f = new Fruit("杨梅" , FruitTaste.YIBAN , "f");64 Fruit g = new Fruit("黑李" , FruitTaste.NANGCHI , "g");65 Fruit h = new Fruit("火龙果", FruitTaste.HAOCHI, "h");66 Fruit i = new Fruit("西瓜" , FruitTaste.YIBAN, "i");67
68 //乱序key值
69 fruitMap.put("xniem", b);70 fruitMap.put("asdf", i);71 fruitMap.put("akgjjd", c);72 fruitMap.put("uiooo", f);73 fruitMap.put("qw84", a);74 fruitMap.put("5845uasdf'", d);75 fruitMap.put("48aisdf", e);76 fruitMap.put("458kljsf", g);77 fruitMap.put("4jalsdfj", h);78
79 returnfruitMap;80 }81
82 /**
83 * 由于List能够直接使用Collections进行排序84 * 但是Map不行。85 * 这边所做的操作就是先将Map--》List86 * 然后对List进行排序87 * 然后在讲List--》转换成Map88 *@parammap89 *@return
90 */
91 public static Map sortMapByValue(MapfruitMap) {92 if (fruitMap == null ||fruitMap.isEmpty()) {93 return null;94 }95 //LinkedhashMap是有序的、或者TreeMap都是有序的
96 Map sortedMap = new LinkedHashMap();97 List> entryList = new ArrayList>(fruitMap.entrySet());98 Collections.sort(entryList, newMapValueComparator());99 Iterator> iter =entryList.iterator();100 Map.Entry tmpEntry = null;101 while(iter.hasNext()) {102 tmpEntry =iter.next();103 sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());104 }105 returnsortedMap;106 }107 }108
109
110
111 /**
112 * 比较器规则类113 * 传入对应的Map进行比较114 *@authorelcapitan115 */
116 class MapValueComparator implements Comparator>{117
118 @Override119 public int compare(Entry o1, Entryo2) {120
121 //获取比较的两个对象
122 Fruit fruit1 =o1.getValue();123 Fruit fruit2 =o2.getValue();124
125 //将好吃,难吃映射成具有比较关系的字符1、2、3
126 Map tasteLev = new HashMap<>();127 tasteLev.put(FruitTaste.HAOCHI, 1);128 tasteLev.put(FruitTaste.YIBAN, 2);129 tasteLev.put(FruitTaste.NANGCHI, 3);130
131 int cr = 0;132 //判断好吃不好吃
133 int a = tasteLev.get(fruit2.getFruitTaste())-tasteLev.get(fruit1.getFruitTaste());134 if (a!=0) {135 cr = (a>0) ? -1 : 2;136 } else{137 //按照对应的Id排序
138 a =fruit2.getId().compareTo(fruit1.getId());139 if (a!=0) {140 cr = (a>0)? -2 : 1;141 }142 }143 /*注意上面对一个返回值对应的就是形成比较层次144 * 上层145 * --> 2146 * --> -1147 * 下层148 * --> 1149 * --> -2150 */
151 returncr;152 }153 }154
155 /**
156 * 水果实体类157 * 包含水果名称、水果好吃程度、水果标志158 *@authorelcapitan159 */
160 classFruit {161 privateString fruitName;162 privateString fruitTaste;163 privateString id;164 publicString getFruitName() {165 returnfruitName;166 }167 public voidsetFruitName(String fruitName) {168 this.fruitName =fruitName;169 }170 publicString getFruitTaste() {171 returnfruitTaste;172 }173 public voidsetFruitTaste(String fruitTaste) {174 this.fruitTaste =fruitTaste;175 }176 publicString getId() {177 returnid;178 }179 public voidsetId(String id) {180 this.id =id;181 }182 publicFruit(String fruitName, String fruitTaste, String id) {183 super();184 this.fruitName =fruitName;185 this.fruitTaste =fruitTaste;186 this.id =id;187 }188 }189
190 /**
191 * 水果好吃程度常量类192 * 包括好吃、一般、不好吃193 * 可以继续添加194 *@authorelcapitan195 */
196 classFruitTaste {197 public static final String HAOCHI = "好吃";198 public static final String NANGCHI = "难吃";199 public static final String YIBAN = "一般";200 }