13

可能重复:
如何在 Java 中对 Map 的键进行排序?

在课堂TreeMap上,Java API 说:

基于红黑树的 NavigableMap 实现。地图根据其键的自然顺序排序,或者由地图创建时提供的 Comparator 排序,具体取决于使用的构造函数。

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

4

5 回答 5

9

如果你自己尝试这个,你会发现你不能使用没有实现TreeMap的 a (除非你通过构造函数显式地提供 a )。KComparableComparatorTreeMap

public class App 
{
    public static void main( String[] args )
    {
        TreeMap<App,String> tm = new TreeMap<App,String>();
        tm.put(new App(), "value");
    }
}

线程“主”java.lang.ClassCastException 中的异常:应用程序无法转换为 java.lang.Comparable

javadocput()明确说明了这一点:

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

“自然排序”的 TreeMap 的 javadocs 中的链接将您带到Comparable界面

于 2012-12-30T01:53:45.487 回答
5

“自然”排序是ComparableTreeMap. 本质上,RBTree 必须能够分辨哪个键小于另一个键,并且有两种方法可以将该逻辑提供给 RBTree 实现:

  • Comparable在用作键的类中实现接口TreeMap,或
  • 提供一个Comparator可以在键类本身之外进行比较的实现。
于 2012-12-30T01:44:40.203 回答
4

实施的要求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)

如有疑问,请阅读TreeMap来源。例如,第 541 行。

于 2012-12-30T01:56:15.453 回答
2

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

于 2012-12-30T01:55:17.900 回答
0

自然顺序由键确定。

因此,如果您使用字符串,您将获得一个排序;整数将给出另一个。

我认为 Comparable 是一个要求。

于 2012-12-30T01:43:52.697 回答