Java 与 TreeSet 相媲美
Java Comparable and TreeSet
为什么放入TreeSet的对象必须实现Comparable接口?
我正在尝试创建一个包含我自己的一些对象的 TreeSet class,但是当我尝试在集合中添加对象时抛出 ClassCastException。
TreeSet
is an ordered implementation of Set
. Specifically, TreeSet
implements NavigableSet
and SortedSet
, Set
.
的两个子接口
Comparable
当 TreeSet
的值被迭代时,它们将按照对象的 class 定义的顺序返回。当所讨论的对象具有一些自然的顺序概念时,这可能很有用 - 即某些值是 'less than' 或 'more than' 其他值(例如日期)。
在 Java 中,定义给定 class 的对象顺序的方法是让 class 实现 Comparable
.
如果您不关心顺序(通常是这种情况),您可以改用 HashSet
。
或者,如果您关心元素 添加的顺序 (但不是它们的 'natural' 顺序),您可以使用 LinkedHashSet
.
Comparator
最后,您有时可能对具有保证迭代顺序(不是添加元素的顺序)但不是自然顺序的集合感兴趣compareTo
定义的对象。发生这种情况时,您可以使用 constructor for TreeSet
which takes an explicit Comparator
。这个比较器定义了 specific 映射的顺序(例如迭代),这可能与自然顺序不同——如果对象有一个,它们在使用时不必这样做这个构造函数。
为什么放入TreeSet的对象必须实现Comparable接口? 我正在尝试创建一个包含我自己的一些对象的 TreeSet class,但是当我尝试在集合中添加对象时抛出 ClassCastException。
TreeSet
is an ordered implementation of Set
. Specifically, TreeSet
implements NavigableSet
and SortedSet
, Set
.
Comparable
当 TreeSet
的值被迭代时,它们将按照对象的 class 定义的顺序返回。当所讨论的对象具有一些自然的顺序概念时,这可能很有用 - 即某些值是 'less than' 或 'more than' 其他值(例如日期)。
在 Java 中,定义给定 class 的对象顺序的方法是让 class 实现 Comparable
.
如果您不关心顺序(通常是这种情况),您可以改用 HashSet
。
或者,如果您关心元素 添加的顺序 (但不是它们的 'natural' 顺序),您可以使用 LinkedHashSet
.
Comparator
最后,您有时可能对具有保证迭代顺序(不是添加元素的顺序)但不是自然顺序的集合感兴趣compareTo
定义的对象。发生这种情况时,您可以使用 constructor for TreeSet
which takes an explicit Comparator
。这个比较器定义了 specific 映射的顺序(例如迭代),这可能与自然顺序不同——如果对象有一个,它们在使用时不必这样做这个构造函数。