JAVA中对TreeMap中文排序

本文介绍了一种使用CollatorComparator实现TreeMap排序的方法。通过Collator获取排序键并比较两个元素之间的顺序,适用于国际化环境中字符串的自然排序。
项目中用到一个对于Map排序的。下面贴出代码:

package org.hsyd.test;

import java.text.CollationKey;
import java.text.Collator;
import java.util.Comparator;

/**
* 对treeMap排序
* @author Administrator
*
*/
public class CollatorComparator implements Comparator {
Collator collator = Collator.getInstance();
public int compare(Object element1, Object element2) {
CollationKey key1 = collator.getCollationKey(element1.toString());
CollationKey key2 = collator.getCollationKey(element2.toString());
return key1.compareTo(key2);
}
}
//这样引用:
CollatorComparator comparator = new CollatorComparator();
TreeMap<String, HashMap<Long, Integer>> map=new TreeMap<String, HashMap<Long,Integer>>(comparator);
### TreeMap 的基本排序机制 `TreeMap` 是基于红黑树实现的 `NavigableMap`,它能够按照键的自然顺序或自定义顺序进行排序。在默认情况下,`TreeMap` 使用键的自然顺序进行排序,前提是键必须实现 `Comparable` 接口。如果需要自定义排序规则,则可以在构造 `TreeMap` 时传入一个 `Comparator` 实例。 例如,使用 `Comparator.reverseOrder()` 创建一个按降序排列的 `TreeMap`: ```java TreeMap<Integer, String> map = new TreeMap<>(Comparator.reverseOrder()); map.put(3, "val"); map.put(2, "val"); map.put(1, "val"); map.put(5, "val"); map.put(4, "val"); System.out.println(map); // 输出 {5=val, 4=val, 3=val, 2=val, 1=val} ``` 此方式适用于对键进行反向排序的需求,也可以通过自定义 `Comparator` 来实现更复杂的排序逻辑[^3]。 --- ### 按值排序的实现方法 虽然 `TreeMap` 默认是根据键进行排序的,但可以通过一些技巧来实现基于值的排序。一种常见的做法是创建一个 `LinkedHashMap`,并将其插入顺序保持为根据值排序后的结果。具体步骤如下: 1. 将原始 `Map` 的键值对转换为一个 `List`。 2. 使用自定义的比较器对列表进行排序。 3. 将排序后的键值对依次放入 `LinkedHashMap` 中,以保持顺序。 以下是一个示例代码,展示如何实现这一过程: ```java import java.util.*; public class SortMapByValue { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Apple"); map.put(3, "Orange"); map.put(2, "Banana"); Map<Integer, String> sortedMap = sortByValue(map); System.out.println(sortedMap); // 输出 {1=Apple, 2=Banana, 3=Orange} } public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet()); list.sort(Map.Entry.comparingByValue()); Map<K, V> result = new LinkedHashMap<>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; } } ``` 该方法利用了 `Map.Entry.comparingByValue()` 方法进行排序,并通过 `LinkedHashMap` 保留排序后的插入顺序[^1]。 --- ### 自定义比较器的应用场景 在某些情况下,默认的自然排序可能无法满足需求,此时可以使用自定义比较器。例如,当键中包含 `null` 值时,标准的自然排序会抛出 `NullPointerException`,而自定义比较器可以灵活处理这种情况。 以下是一个支持 `null` 键的自定义比较器示例: ```java TreeMap<String, Integer> withNull = new TreeMap<>((a, b) -> { if (a == null) return b == null ? 0 : -1; if (b == null) return 1; return a.compareTo(b); }); withNull.put(null, 1); ``` 在这个例子中,`null` 键被赋予了一个特定的优先级,使得整个排序过程更加灵活和健壮[^2]。 --- ### 内存占用与性能考量 由于 `TreeMap` 是基于红黑树实现的,其每个节点除了存储键值对外,还需要额外的空间来维护树结构(如左右子节点、父节点以及颜色信息)。这导致 `TreeMap` 的内存消耗通常比 `HashMap` 更高,大约高出 30% 左右。相比之下,`HashMap` 使用哈希表结构,内存占用更为紧凑,但在负载因子较低时可能会存在未使用的数组槽位。 因此,在选择数据结构时,应根据具体场景权衡内存占用和操作效率。对于需要频繁排序且数据量较大的情况,`TreeMap` 是一个合适的选择;而对于不需要排序、追求高效查找和插入的场景,则更适合使用 `HashMap`。 --- ### 典型使用场景 - **按键排序**:当需要根据键的自然顺序或自定义顺序对数据进行排序时,`TreeMap` 是首选方案。例如,统计用户分数排行榜时,可以将用户名作为键,分数作为值,并按用户名排序。 - **范围查询**:`TreeMap` 提供了丰富的导航方法(如 `floorEntry()`、`ceilingEntry()` 等),非常适合用于执行范围查询和最近匹配操作。 - **分组排序**:结合 `Stream API` 和 `TreeMap`,可以在原排序基础上进一步实现分组排序,适用于多条件排序的复杂业务逻辑。 --- ### 相关问题 1. 如何在 Java 中使用 TreeMap 进行自定义排序? 2. TreeMap 和 HashMap 在性能和内存占用方面有哪些差异? 3. 如何在 Java 中实现基于 Map 值的排序? 4. TreeMap 是否支持 null 键和 null 值?如何处理? 5. TreeMap 提供了哪些导航方法?它们的典型应用场景是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值