作者:明明如月学长, **** 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。
热门文章推荐:
(1)《人工智能时代,软件工程师们将会被取代?》
(2)《超全人工智能 AI工具导航网站合集》
(3)《如何写出高质量的文章:从战略到战术》
(4)《什么? 你还没用过 Cursor? 智能 AI 代码生成工具 Cursor 安装和使用介绍》
(5)《我的性能方法论》
(6)《无需魔法打开即用的 AI 工具集锦》
在实际业务开发中,可能会遇到Java Map按值排序的需要。
Java Map按值排序的常见思路是:
1、 将map中的entry放到List中
2、 对List中的entry通过比较器按值排序
3 、将排序后的entry放到linkedhashmap中
Java 8利用Stream
import ;
import ;
import ;
import ;
import static ;
import static ;
public class SortTest {
public static void main(String[] args) throws Exception {
// 创建一个字符串为Key,数字为值的map
Map<String, Integer> budget = new HashMap<>();
("clothes", 120);
("grocery", 150);
("transportation", 100);
("utility", 130);
("rent", 1150);
("miscellneous", 90);
("排序前: " + budget);
// 按值排序 升序
Map<String, Integer> sorted = budget
.entrySet()
.stream()
.sorted(comparingByValue())
.collect(
toMap(::getKey, ::getValue, (e1, e2) -> e2,
LinkedHashMap::new));
("升序按值排序后的map: " + sorted);
// 按值排序降序
sorted = budget
.entrySet()
.stream()
.sorted((comparingByValue()))
.collect(
toMap(::getKey, ::getValue, (e1, e2) -> e2,
LinkedHashMap::new));
("降序按值排序后的map: " + sorted);
}
}
可以封装成工具类
/**
* Map排序工具类
*
* @author liuwangyanghdu@ 明明如月
*/
public class MapSortUtil {
private static Comparator<> comparatorByKeyAsc = ( o1, o2) -> {
if (() instanceof Comparable) {
return ((Comparable) ()).compareTo(());
}
throw new UnsupportedOperationException("键的类型尚未实现Comparable接口");
};
private static Comparator<> comparatorByKeyDesc = ( o1, o2) -> {
if (() instanceof Comparable) {
return ((Comparable) ()).compareTo(());
}
throw new UnsupportedOperationException("键的类型尚未实现Comparable接口");
};
private static Comparator<> comparatorByValueAsc = ( o1, o2) -> {
if (() instanceof Comparable) {
return ((Comparable) ()).compareTo(());
}
throw new UnsupportedOperationException("值的类型尚未实现Comparable接口");
};
private static Comparator<> comparatorByValueDesc = ( o1, o2) -> {
if (() instanceof Comparable) {
return ((Comparable) ()).compareTo(());
}
throw new UnsupportedOperationException("值的类型尚未实现Comparable接口");
};
/**
* 按键升序排列
*/
public static <K, V> Map<K, V> sortByKeyAsc(Map<K, V> originMap) {
if (originMap == null) {
return null;
}
return sort(originMap, comparatorByKeyAsc);
}
/**
* 按键降序排列
*/
public static <K, V> Map<K, V> sortByKeyDesc(Map<K, V> originMap) {
if (originMap == null) {
return null;
}
return sort(originMap, comparatorByKeyDesc);
}
/**
* 按值升序排列
*/
public static <K, V> Map<K, V> sortByValueAsc(Map<K, V> originMap) {
if (originMap == null) {
return null;
}
return sort(originMap, comparatorByValueAsc);
}
/**
* 按值降序排列
*/
public static <K, V> Map<K, V> sortByValueDesc(Map<K, V> originMap) {
if (originMap == null) {
return null;
}
return sort(originMap, comparatorByValueDesc);
}
private static <K, V> Map<K, V> sort(Map<K, V> originMap, Comparator<> comparator) {
return ()
.stream()
.sorted(comparator)
.collect(
(::getKey, ::getValue, (e1, e2) -> e2,
LinkedHashMap::new));
}
}
测试类
package ;
import ;
import ;
import ;
import ;
import ;
/**
* Map排序工具类
*
* @author liuwangyanghdu@ 明明如月
*/
@TestInstance(.PER_CLASS)
class MapSortUtilTest {
// 创建一个字符串为Key,数字为值的map
Map<String, Integer> budget = new HashMap<>();
@BeforeAll
public void init() {
("clothes", 120);
("grocery", 150);
("transportation", 100);
("utility", 130);
("rent", 1150);
("miscellneous", 90);
("排序前: " + budget);
}
@Test
void sortByKeyAsc() {
("按键升序" + (budget));
}
@Test
void sortByKeyDesc() {
("按键降序" + (budget));
}
@Test
void sortByValueAsc() {
("按值升序" + (budget));
}
@Test
void sortByValueDesc() {
("按值降序" + (budget));
}
}
Java 7版本
import .*;
import .*;
public class GFG {
// hashmap按值排序
public static HashMap<String, Integer> sortByValue(HashMap<String, Integer> hm)
{
// HashMap的entry放到List中
List<<String, Integer> > list =
new LinkedList<<String, Integer> >(());
// 对List按entry的value排序
(list, new Comparator<<String, Integer> >() {
public int compare(<String, Integer> o1,
<String, Integer> o2)
{
return (()).compareTo(());
}
});
// 将排序后的元素放到LinkedHashMap中
HashMap<String, Integer> temp = new LinkedHashMap<String, Integer>();
for (<String, Integer> aa : list) {
((), ());
}
return temp;
}
public static void main(String[] args)
{
HashMap<String, Integer> hm = new HashMap<String, Integer>();
// 填充测试数据
("Math", 98);
("Data Structure", 85);
("Database", 91);
("Java", 95);
("Operating System", 79);
("Networking", 80);
Map<String, Integer> hm1 = sortByValue(hm);
// 打印按值排序后的数据
for (<String, Integer> en : ()) {
("Key = " + () +
", Value = " + ());
}
}
}
参考文章:
1、 Java 8 – Sorting HashMap by values in ascending and descending order
2、 Sort a Map
3、Sorting a Hashmap according to values
如果文章对你有帮助,欢迎点赞,关注,你的鼓励是我创作的最大动力!!