用java如何排序_如何用Java对地图排序

很少有Java示例通过其键或值对Map进行排序。

注意  如果您使用的是Java 8,请参阅本文– 如何使用流API对地图进行排序

1.按键排序

1.1使用java.util.TreeMap ,它将自动按键对Map进行排序。

SortByKeyExample1.java

package com.mkyong.test;

import java.util.HashMap;

import java.util.Map;

import java.util.TreeMap;

public class SortByKeyExample1 {

public static void main(String[] args) {

Map unsortMap = new HashMap();

unsortMap.put("Z", "z");

unsortMap.put("B", "b");

unsortMap.put("A", "a");

unsortMap.put("C", "c");

unsortMap.put("D", "d");

unsortMap.put("E", "e");

unsortMap.put("Y", "y");

unsortMap.put("N", "n");

unsortMap.put("J", "j");

unsortMap.put("M", "m");

unsortMap.put("F", "f");

System.out.println("Unsort Map......");

printMap(unsortMap);

System.out.println("\nSorted Map......By Key");

Map treeMap = new TreeMap(unsortMap);

printMap(treeMap);

}

//pretty print a map

public static void printMap(Map map) {

for (Map.Entry entry : map.entrySet()) {

System.out.println("Key : " + entry.getKey()

+ " Value : " + entry.getValue());

}

}

}

输出量

Unsort Map......

Key : A Value : a

Key : B Value : b

Key : C Value : c

Key : D Value : d

Key : E Value : e

Key : F Value : f

Key : Y Value : y

Key : Z Value : z

Key : J Value : j

Key : M Value : m

Key : N Value : n

Sorted Map......By Key

Key : A Value : a

Key : B Value : b

Key : C Value : c

Key : D Value : d

Key : E Value : e

Key : F Value : f

Key : J Value : j

Key : M Value : m

Key : N Value : n

Key : Y Value : y

Key : Z Value : z

1.2另一个java.util.TreeMap示例提供了一个自定义的Comparator来对键进行降序排序。

SortByKeyExample2.java

package com.mkyong.test;

import java.util.Comparator;

import java.util.HashMap;

import java.util.Map;

import java.util.TreeMap;

public class SortByKeyExample2 {

public static void main(String[] args) {

Map unsortMap = new HashMap();

unsortMap.put(10, "z");

unsortMap.put(5, "b");

unsortMap.put(6, "a");

unsortMap.put(20, "c");

unsortMap.put(1, "d");

unsortMap.put(7, "e");

unsortMap.put(8, "y");

unsortMap.put(99, "n");

unsortMap.put(50, "j");

unsortMap.put(2, "m");

unsortMap.put(9, "f");

System.out.println("Unsort Map......");

printMap(unsortMap);

System.out.println("\nSorted Map......By Key");

Map treeMap = new TreeMap(

new Comparator() {

@Override

public int compare(Integer o1, Integer o2) {

return o2.compareTo(o1);

}

});

/* For Java 8, try this lambda

Map treeMap = new TreeMap<>(

(Comparator) (o1, o2) -> o2.compareTo(o1)

);

*/

treeMap.putAll(unsortMap);

printMap(treeMap);

}

public static void printMap(Map map) {

for (Map.Entry entry : map.entrySet()) {

System.out.println("Key : " + entry.getKey()

+ " Value : " + entry.getValue());

}

}

}

输出量

Unsort Map......

Key : 1 Value : d

Key : 50 Value : j

Key : 2 Value : m

Key : 99 Value : n

Key : 20 Value : c

Key : 5 Value : b

Key : 6 Value : a

Key : 7 Value : e

Key : 8 Value : y

Key : 9 Value : f

Key : 10 Value : z

Sorted Map......By Key

Key : 99 Value : n

Key : 50 Value : j

Key : 20 Value : c

Key : 10 Value : z

Key : 9 Value : f

Key : 8 Value : y

Key : 7 Value : e

Key : 6 Value : a

Key : 5 Value : b

Key : 2 Value : m

Key : 1 Value : d

2.按值排序

将Map转换为List ,使用自定义Comparator对List进行排序,然后将其放入新的插入顺序地图中– LinkedHashMap

Map ---> List ---> Collections.sort() --> List (Sorted) ---> LinkedHashMap

SortByValueExample1.java

package com.mkyong.test;

import java.util.*;

public class SortByValueExample1 {

public static void main(String[] args) {

Map unsortMap = new HashMap();

unsortMap.put("z", 10);

unsortMap.put("b", 5);

unsortMap.put("a", 6);

unsortMap.put("c", 20);

unsortMap.put("d", 1);

unsortMap.put("e", 7);

unsortMap.put("y", 8);

unsortMap.put("n", 99);

unsortMap.put("j", 50);

unsortMap.put("m", 2);

unsortMap.put("f", 9);

System.out.println("Unsort Map......");

printMap(unsortMap);

System.out.println("\nSorted Map......By Value");

Map sortedMap = sortByValue(unsortMap);

printMap(sortedMap);

}

private static Map sortByValue(Map unsortMap) {

// 1. Convert Map to List of Map

List> list =

new LinkedList>(unsortMap.entrySet());

// 2. Sort list with Collections.sort(), provide a custom Comparator

//    Try switch the o1 o2 position for a different order

Collections.sort(list, new Comparator>() {

public int compare(Map.Entry o1,

Map.Entry o2) {

return (o1.getValue()).compareTo(o2.getValue());

}

});

// 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap

Map sortedMap = new LinkedHashMap();

for (Map.Entry entry : list) {

sortedMap.put(entry.getKey(), entry.getValue());

}

/*

//classic iterator example

for (Iterator> it = list.iterator(); it.hasNext(); ) {

Map.Entry entry = it.next();

sortedMap.put(entry.getKey(), entry.getValue());

}*/

return sortedMap;

}

public static void printMap(Map map) {

for (Map.Entry entry : map.entrySet()) {

System.out.println("Key : " + entry.getKey()

+ " Value : " + entry.getValue());

}

}

}

输出量

Unsort Map......

Key : a Value : 6

Key : b Value : 5

Key : c Value : 20

Key : d Value : 1

Key : e Value : 7

Key : f Value : 9

Key : y Value : 8

Key : z Value : 10

Key : j Value : 50

Key : m Value : 2

Key : n Value : 99

Sorted Map......By Value

Key : d Value : 1

Key : m Value : 2

Key : b Value : 5

Key : a Value : 6

Key : e Value : 7

Key : y Value : 8

Key : f Value : 9

Key : z Value : 10

Key : c Value : 20

Key : j Value : 50

Key : n Value : 99

2.2升级上述sortByValue()方法以支持泛型。

public static > Map sortByValue(Map unsortMap) {

List> list =

new LinkedList>(unsortMap.entrySet());

Collections.sort(list, new Comparator>() {

public int compare(Map.Entry o1, Map.Entry o2) {

return (o1.getValue()).compareTo(o2.getValue());

}

});

Map result = new LinkedHashMap();

for (Map.Entry entry : list) {

result.put(entry.getKey(), entry.getValue());

}

return result;

}

更新记录

2010年7月7日–初稿。  2014年7月8日–添加更多示例并修正错别字。  2016年8月12日–添加通用方法,重新设置代码格式,修正拼写错误并重写一些内容。

参考文献

TreeMap JavaDoc  LinkedHashMap JavaDoc  比较器JavaDoc  Java 8 –如何对地图排序  通配符带来更多乐趣  Collections.sort()签名  Java中超级T>和扩展T>之间的区别

标记: 通用 Java 映射 排序 树 映射

翻译自: https://mkyong.com/java/how-to-sort-a-map-in-java/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值