可能重复:
如何在 Java 中对 Map 的键进行排序?
在课堂TreeMap
上,Java API 说:
基于红黑树的 NavigableMap 实现。地图根据其键的自然顺序排序,或者由地图创建时提供的 Comparator 排序,具体取决于使用的构造函数。
自然排序是什么意思?用作键的类不必实现Comparable
接口,但是将使用什么顺序来代替?
可能重复:
如何在 Java 中对 Map 的键进行排序?
在课堂TreeMap
上,Java API 说:
基于红黑树的 NavigableMap 实现。地图根据其键的自然顺序排序,或者由地图创建时提供的 Comparator 排序,具体取决于使用的构造函数。
自然排序是什么意思?用作键的类不必实现Comparable
接口,但是将使用什么顺序来代替?
如果你自己尝试这个,你会发现你不能使用没有实现TreeMap
的 a (除非你通过构造函数显式地提供 a )。K
Comparable
Comparator
TreeMap
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
界面
“自然”排序是Comparable
在TreeMap
. 本质上,RBTree 必须能够分辨哪个键小于另一个键,并且有两种方法可以将该逻辑提供给 RBTree 实现:
Comparable
在用作键的类中实现接口TreeMap
,或Comparator
可以在键类本身之外进行比较的实现。这是实施的要求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 行。
自然排序只是Comparable
接口提供的顺序。您可以创建TreeMap
不带 a 的 a Comparator
,但是任何尝试放置任何未实现自然顺序的键都会抛出 a ClassCastException
。
自然顺序由键确定。
因此,如果您使用字符串,您将获得一个排序;整数将给出另一个。
我认为 Comparable 是一个要求。