Java中Map排序方法及示例
编辑:本站更新:2025-03-16 17:34:20人气:1477
在Java编程语言中,集合框架提供了一个名为`java.util.Map`的接口用于存储键值对数据结构。然而,默认情况下,Map并非有序容器,在遍历或输出时元素顺序并不固定。但在某些应用场景下,我们可能需要按照特定规则(如:按Key、Value或者自定义比较器)进行排序后的映射结果展示。为此,我们可以借助于另外两个类——TreeMap和LinkedHashMap来实现这一需求。
1. **使用TreeMap**:
TreeMap是基于红黑树(Red-Black Tree)实现的一个SortedMap子接口实例,它会自动将其条目按键(key)进行升序排列。创建一个TreeMap并添加元素后,其内部将始终保持排序状态。
import java.util.*;
public class Main {
public static void main(String[] args) {
// 创建一个新的TreeMap对象,并指定自然排序(默认为key的Comparable特性)
Map<String, Integer> sortedByKeys = new TreeMap<>();
// 添加一些元素到map中
sortedByKeys.put("Apple", 5);
sortedByKeys.put("Orange", 3);
sortedByKeys.put("Banana", 7);
System.out.println(sortedByKeys);
// 输出: {Apple=5, Banana=7, Orange=3}
// 如果要改变排序方式比如降序,可以通过Comparator构造函数初始化TreeMap:
Comparator<String> reverseOrderByKey = (k1, k2) -> -k1.compareTo(k2);
SortedMap<String,Integer> reversedSortMap = new TreeMap<>(reverseOrderByKey);
for(Map.Entry<String, Integer>e :sortedByKeys.entrySet()){
reversedSortMap.put(e.getKey(), e.getValue());
}
System.out.println(reversedSortMap);
// 输出: {Orange=3, Apple=5, Banana=7}
}
}
2. **使用LinkedHashMap**:
尽管TreeMap提供了天然的排序功能,但如果我们希望保留插入次序或者是最近访问/修改过的记录优先,则更适合选用 LinkedHashMaP。因为它可以维护元素插入的迭代顺序以及LRU缓存策略下的更新顺序。
例如保持 insertion order 的场景如下所示:
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
LinkedHashMap<Integer,String> linkedHashMap = new LinkedHashMap<>();
// 插入数据
linkedHashMap.put(4,"Pear");
linkedHashMap.put(6,"Grape");
linkedHashMap.put(2,"Strawberry");
// 默认行为就是维持insertion-order
Set<Map.Entry<Integer, String>> entriesOrderedByInsertion =
linkedHashMap.entrySet();
List<Map.Entry<Integer, String>> orderedList =
entriesOrderedByInsertion.stream()
.collect(Collectors.toList());
System.out.println(orderedList);
// 输出: [{2=Pear}, {4=Grape}, {6=Strawberry}]
// 若要使linkedhashmap依据value大小排序:
LinkedHashMap<Integer, String> valueSortedMap = new LinkedHashMap<>(
linkedHashMap.entrySet().stream()
..sorted(Map.Entry.comparingByValue())
.peek(e -> linkedHashMap.remove(e.getKey()))
.toArray(size -> new HashMap[size])
);
linkedHashMap.putAll(valueSortedMap);
System.out.println(linkedHashMap);
// 根据value排序后输出: {2=Strawberry, 4=Pear, 6=Grape}
}
}
需要注意的是以上代码段中的“根据value排序”部分相对复杂些,因为LinkedHashMap本身不支持直接通过values排序。此处采用了一种间接的方式先构建新的流式处理链路完成排序后再合并回原Map的方法实现了该效果。
总结来说,在 Java 中针对 `Map` 排序的需求通常可通过两种途径解决:若需保证严格的 key 或者 custom comparator 原则上的排序选择 `TreeMap`; 若关注点在于保存插入 / 更新序列而不仅仅是某种确定性排序的话可考虑 `LinkedHashMap` 。不同的业务场景应灵活选取合适的工具以达到最优解。
1. **使用TreeMap**:
TreeMap是基于红黑树(Red-Black Tree)实现的一个SortedMap子接口实例,它会自动将其条目按键(key)进行升序排列。创建一个TreeMap并添加元素后,其内部将始终保持排序状态。
java
import java.util.*;
public class Main {
public static void main(String[] args) {
// 创建一个新的TreeMap对象,并指定自然排序(默认为key的Comparable特性)
Map<String, Integer> sortedByKeys = new TreeMap<>();
// 添加一些元素到map中
sortedByKeys.put("Apple", 5);
sortedByKeys.put("Orange", 3);
sortedByKeys.put("Banana", 7);
System.out.println(sortedByKeys);
// 输出: {Apple=5, Banana=7, Orange=3}
// 如果要改变排序方式比如降序,可以通过Comparator构造函数初始化TreeMap:
Comparator<String> reverseOrderByKey = (k1, k2) -> -k1.compareTo(k2);
SortedMap<String,Integer> reversedSortMap = new TreeMap<>(reverseOrderByKey);
for(Map.Entry<String, Integer>e :sortedByKeys.entrySet()){
reversedSortMap.put(e.getKey(), e.getValue());
}
System.out.println(reversedSortMap);
// 输出: {Orange=3, Apple=5, Banana=7}
}
}
2. **使用LinkedHashMap**:
尽管TreeMap提供了天然的排序功能,但如果我们希望保留插入次序或者是最近访问/修改过的记录优先,则更适合选用 LinkedHashMaP。因为它可以维护元素插入的迭代顺序以及LRU缓存策略下的更新顺序。
例如保持 insertion order 的场景如下所示:
java
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
LinkedHashMap<Integer,String> linkedHashMap = new LinkedHashMap<>();
// 插入数据
linkedHashMap.put(4,"Pear");
linkedHashMap.put(6,"Grape");
linkedHashMap.put(2,"Strawberry");
// 默认行为就是维持insertion-order
Set<Map.Entry<Integer, String>> entriesOrderedByInsertion =
linkedHashMap.entrySet();
List<Map.Entry<Integer, String>> orderedList =
entriesOrderedByInsertion.stream()
.collect(Collectors.toList());
System.out.println(orderedList);
// 输出: [{2=Pear}, {4=Grape}, {6=Strawberry}]
// 若要使linkedhashmap依据value大小排序:
LinkedHashMap<Integer, String> valueSortedMap = new LinkedHashMap<>(
linkedHashMap.entrySet().stream()
..sorted(Map.Entry.comparingByValue())
.peek(e -> linkedHashMap.remove(e.getKey()))
.toArray(size -> new HashMap[size])
);
linkedHashMap.putAll(valueSortedMap);
System.out.println(linkedHashMap);
// 根据value排序后输出: {2=Strawberry, 4=Pear, 6=Grape}
}
}
需要注意的是以上代码段中的“根据value排序”部分相对复杂些,因为LinkedHashMap本身不支持直接通过values排序。此处采用了一种间接的方式先构建新的流式处理链路完成排序后再合并回原Map的方法实现了该效果。
总结来说,在 Java 中针对 `Map` 排序的需求通常可通过两种途径解决:若需保证严格的 key 或者 custom comparator 原则上的排序选择 `TreeMap`; 若关注点在于保存插入 / 更新序列而不仅仅是某种确定性排序的话可考虑 `LinkedHashMap` 。不同的业务场景应灵活选取合适的工具以达到最优解。
www.php580.com PHP工作室 - 全面的PHP教程、实例、框架与实战资源
PHP学习网是专注于PHP技术学习的一站式在线平台,提供丰富全面的PHP教程、深入浅出的实例解析、主流PHP框架详解及实战应用,并涵盖PHP面试指南、最新资讯和活跃的PHP开发者社区。无论您是初学者还是进阶者,这里都有助于提升您的PHP编程技能。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。