Java 为什么以及何时使用TreeMap

Java 为什么以及何时使用TreeMap,java,collections,treemap,Java,Collections,Treemap,有人能告诉我什么时候以及为什么要使用树形图吗 但是没有找到我的答案 按照我的想法,我们使用treemap根据您的键进行数据排序,我们也可以通过其他方式实现这一点。 基于红黑树的NavigableMap实现。映射根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于使用的构造函数 此实现为containsKey、get、put和remove操作提供了有保证的日志(n)时间开销。算法是对Cormen、Leiserson和Rivest的算法介绍中的算法的改编 当您需要排序键时,使

有人能告诉我什么时候以及为什么要使用树形图吗 但是没有找到我的答案


按照我的想法,我们使用treemap根据您的键进行数据排序,我们也可以通过其他方式实现这一点。

基于红黑树的NavigableMap实现。映射根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于使用的构造函数

此实现为containsKey、get、put和remove操作提供了有保证的日志(n)时间开销。算法是对Cormen、Leiserson和Rivest的算法介绍中的算法的改编


当您需要排序键时,使用此数据结构不仅可以向上传递
comparator
到构造函数
TreeMap(Comparator您链接到的javadoc清楚地说明了它是和映射接口的实现。您需要此功能时可以使用它。

这是按某个键对对象进行排序的有效方法。如果随机访问对您也很重要,那么TreeMap就是答案。有了此数据结构,您可以按顺序进行迭代

如果不需要随机访问,则使用分类的集合/包或列表


假设您想要实现一个字典并按字母顺序打印它,您可以使用树映射和树集的组合:

public static void main(String args[]) {
    Map<String, Set<String>> dictionary = new TreeMap<>();
    Set<String> a = new TreeSet<>(Arrays.asList("Actual", "Arrival", "Actuary"));
    Set<String> b = new TreeSet<>(Arrays.asList("Bump", "Bravo", "Basic"));

    dictionary.put("B", b);
    dictionary.put("A", a);

    System.out.println(dictionary);
}
publicstaticvoidmain(字符串参数[]){
映射字典=新树映射();
集合a=新树集(Arrays.asList(“实际”、“到达”、“精算师”);
集合b=新树集(Arrays.asList(“Bump”、“Bravo”、“Basic”);
放在字典里(“B”,B);
字典。放(“A”,A);
System.out.println(字典);
}
所有分拣均自动完成,并打印:

{A=[实际、精算、到达],B=[基本、精彩、颠簸]}


当然,您也可以手动对结构进行排序,但是使用TreeMap/Set可以更高效,减少代码行数(=错误数),并且更具可读性。

还有其他方法,但这是最简单的。您建议用什么其他方法对键值对进行排序?“按照我的想法,我们使用treemap根据您的键进行数据排序,我们也可以通过其他方式实现这一点。“-完全正确!@jlordo comparable and comparator interfaces.@Sunil要在树映射中对键值对进行排序,键必须是
comparable
,并且您仍然没有显示任何比树映射更容易排序的内容(按键)键值对。如果键和值之间有1:1的关系,可以将值用作键,将键用作值,如果没有,我认为没有好的解决方案,即使在Guava中也没有,这可能是您过度考虑数据设计决策的原因。为什么/为什么需要按值排序的键值对?(您可以实现一个类,比如
MySortedSet扩展HashSet
,并提供一个适合您需要的比较器。