什么是TreeMap中的“自然排序”?

时间:2012-12-30 01:42:51

标签: java treemap

  

可能重复:
  How can I sort the keys of a Map in Java?

在类TreeMap中,Java API说:

  

基于红黑树的NavigableMap实现。地图根据其键的自然顺序进行排序,或者根据使用的构造函数在地图创建时提供的比较器进行排序。

自然排序是什么意思?用作键的类不必实现Comparable接口,而是使用什么顺序?

5 个答案:

答案 0 :(得分:6)

如果你自己尝试这样做,你会发现你不能使用TreeMap K未实现Comparable的{​​{1}}(除非你明确提供{{1}通过Comparator构造函数)。

TreeMap
  

线程“main”中的异常java.lang.ClassCastException:App无法强制转换为java.lang.Comparable

public class App { public static void main( String[] args ) { TreeMap<App,String> tm = new TreeMap<App,String>(); tm.put(new App(), "value"); } } 的javadoc明确说明了这一点:

  

抛出:
  ClassCastException - 如果指定的键无法与地图中当前的键进行比较

javadocs for TreeMap中的“自然订购”链接将您带到put()界面

答案 1 :(得分:5)

“自然”排序是由TreeMap中用作键的对象实现Comparable接口所暗示的排序。从本质上讲,RBTree必须能够告诉哪个键小于另一个键,并且有两种方法可以将该逻辑提供给RBTree实现:

  • 在用作TreeMap的键或
  • 的类中实现Comparable接口
  • 提供Comparator的实现,它将在密钥类本身之外进行比较。

答案 2 :(得分:3)

是实施Comparable的要求。它只是在编译时没有强制执行。

jamlong% cat Wah.java

import java.util.*; 

public class Wah {

    public static void main(String[] args) {
        TreeMap<Wah, Integer> wah = new TreeMap<Wah, Integer>(); 
        wah.put(new Wah(), 1); 
        wah.put(new Wah(), 2);
    } 
}

jamlong% java Wah

Exception in thread "main" java.lang.ClassCastException: Wah cannot be cast to java.lang.Comparable
    at java.util.TreeMap.put(TreeMap.java:542)
    at Wah.main(Wah.java:8)

如有疑问,read the TreeMap source。例如,第541行。

答案 3 :(得分:2)

自然排序只是Comparable接口提供的顺序。您可以在没有TreeMap的情况下创建Comparator,但是任何尝试放置任何未实现自然顺序的键都会抛出ClassCastException

答案 4 :(得分:0)

自然顺序由键决定。

因此,如果您使用String,您将获得一个订购;整数将给另一个。

我认为可比较是必需的。

相关问题