【发布时间】:2018-12-07 04:48:45
【问题描述】:
任何 Collection 的构造函数:
public TreeSet(Collection<? extends E> c)
SortedSet 的单独构造函数:
public TreeSet(SortedSet<E> s)
为什么需要为 SortedSet 单独设置一个?
【问题讨论】:
标签: java data-structures collections
任何 Collection 的构造函数:
public TreeSet(Collection<? extends E> c)
SortedSet 的单独构造函数:
public TreeSet(SortedSet<E> s)
为什么需要为 SortedSet 单独设置一个?
【问题讨论】:
标签: java data-structures collections
来自接受SortedSet的构造函数的documentation:
构造一个包含相同元素并使用与指定排序集相同的顺序的新树集。
从Collection 初始化TreeSet 时,使用元素的自然顺序,从另一个接受Collection 的构造函数的documentation 可以看出:
构造一个包含指定集合中元素的新树集,按照其元素的自然顺序排序。
【讨论】:
SortedSet,那么它的排序将丢失,将按照自然排序进行排序。如果它是一个 SortedSet,那么排序将与其Comparator 保持一致。对吗?
public TreeSet(Collection<? extends E> c)
构造一个包含指定元素的新树集 集合,根据其元素的自然顺序排序。 插入集合的所有元素都必须实现 Comparable 界面。此外,所有这些元素必须相互比较: e1.compareTo(e2) 不得为任何元素抛出 ClassCastException 集合中的 e1 和 e2。
更多关注“按照其元素的自然顺序排序”
public TreeSet(SortedSet<E> s)
构造一个包含相同元素并使用 与指定的排序集相同的顺序。
【讨论】:
让我们用两种不同的方式运行这个程序,
public static void main(String[] args) {
List<User> ul = new ArrayList<>();
ul.add(new User());
ul.add(new User());
Set<User> users = new TreeSet<>(ul);
}
首先在下面(这里我们正在实现 Comparator)
private static class User implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
return 0;
}
}
使用此程序,它会在线程“main”java.lang.ClassCastException 中抛出异常:test.WTest$User 无法转换为 java.lang.Comparable
因为这个构造函数期望用户实现 java.util.Comparable 接口。
第二次运行,如果你把 User 类的实现改成下面
private static class User implements Comparable<User> {
@Override
public int compareTo(User o) {
return 0;
}
}
代码运行良好!注意实现的不同,现在我们正在实现 java.lang.Comparable 接口。
但是 TreeSet 类可以同时使用 Comparator 或 Comparable。所以构造函数的选择完全取决于你的对象的实现类型。
【讨论】: