杰瑞科技汇

Java Map如何对key进行排序?

在 Java 中,Map 本身不保证键的顺序(HashMap 是无序的,LinkedHashMap 按插入顺序排序),如果需要对 Map 的键进行排序,通常有以下几种方法:

Java Map如何对key进行排序?-图1
(图片来源网络,侵删)

方法 1:使用 TreeMap(自然排序或自定义排序)

TreeMap 会自动按键的自然顺序(如数字从小到大,字符串字典序)排序,或者通过 Comparator 自定义排序规则。

示例代码

import java.util.*;
public class MapSortExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("banana", 3);
        map.put("apple", 1);
        map.put("orange", 2);
        // 使用 TreeMap 按键自然排序(字典序)
        Map<String, Integer> sortedMap = new TreeMap<>(map);
        System.out.println("按键自然排序:" + sortedMap);
        // 自定义排序规则(如按字符串长度排序)
        Map<String, Integer> customSortedMap = new TreeMap<>(Comparator.comparingInt(String::length));
        customSortedMap.putAll(map);
        System.out.println("按字符串长度排序:" + customSortedMap);
    }
}

输出

按键自然排序:{apple=1, banana=3, orange=2}
按字符串长度排序:{apple=1, orange=2, banana=3}

方法 2:使用 Stream(Java 8+)

如果不想使用 TreeMap,可以用 StreamMap 的键进行排序,然后收集到新的 LinkedHashMap(保持排序顺序)。

示例代码

import java.util.*;
import java.util.stream.*;
public class MapSortExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("banana", 3);
        map.put("apple", 1);
        map.put("orange", 2);
        // 按键自然排序
        Map<String, Integer> sortedMap = map.entrySet().stream()
                .sorted(Map.Entry.comparingByKey())
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (oldValue, newValue) -> oldValue,
                        LinkedHashMap::new
                ));
        System.out.println("按键自然排序:" + sortedMap);
        // 自定义排序(按字符串长度)
        Map<String, Integer> customSortedMap = map.entrySet().stream()
                .sorted(Map.Entry.comparingByKey(Comparator.comparingInt(String::length)))
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (oldValue, newValue) -> oldValue,
                        LinkedHashMap::new
                ));
        System.out.println("按字符串长度排序:" + customSortedMap);
    }
}

输出

按键自然排序:{apple=1, banana=3, orange=2}
按字符串长度排序:{apple=1, orange=2, banana=3}

方法 3:对 HashMap 的键进行排序并输出

如果只是需要排序后的键列表(不关心值),可以直接对 keySet() 进行排序。

示例代码

import java.util.*;
public class MapSortExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("banana", 3);
        map.put("apple", 1);
        map.put("orange", 2);
        // 获取键列表并排序
        List<String> sortedKeys = new ArrayList<>(map.keySet());
        Collections.sort(sortedKeys);
        System.out.println("排序后的键:" + sortedKeys);
    }
}

输出

排序后的键:[apple, banana, orange]

方法 适用场景 特点
TreeMap 需要自动排序的 Map 自动排序,支持自然顺序或自定义 Comparator
Stream + LinkedHashMap 需要灵活排序(如按值排序) 适用于复杂排序逻辑,需 Java 8+
Collections.sort(keySet()) 只需要排序后的键列表 简单直接,但不返回新的 Map

选择哪种方式取决于你的具体需求:

Java Map如何对key进行排序?-图2
(图片来源网络,侵删)
  • 如果需要始终有序的 Map,用 TreeMap
  • 如果需要临时排序或复杂逻辑,用 Stream
  • 如果只需要排序后的键列表,直接排序 keySet()
Java Map如何对key进行排序?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇