对于TreeSet<E>
,定义了以下两个构造函数:
TreeSet<E>(Collections<? extends E> c)
TreeSet<E>(SortedSet<E> ss)
第二种选择需要什么?第一个构造函数不会与整个集合框架范围的对象兼容吗? 即,如果我们需要将SortedSet转换为TreeSet obj,我们是否可以使用第一个构造方法?
请在这方面澄清。
答案 0 :(得分:2)
除了Collection<E>
之外,SortedSet<E>
还可以访问其自定义比较器:
Comparator<? super E> comparator()
构造函数的这个重载让新创建的TreeSet<E>
使用与被复制的有序集相同的自定义排序器。
以下是展示差异的代码:
public static void main (String[] args) throws java.lang.Exception
{
Set<String> a = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
SortedSet<String> b = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
populate(a);
show(a, "Original a");
populate(b);
show(b, "Original b");
Set<String> copyA = new TreeSet<String>(a);
show(copyA, "Copy of a");
Set<String> copyB = new TreeSet<String>(b);
show(copyB, "Copy of b");
}
static void populate(Set<String> s) {
s.add("A");
s.add("aa");
s.add("B");
s.add("bb");
}
static void show(Set<String> s, String name) {
System.out.println("============ "+name+" ==========");
for (String t : s) {
System.out.println(t);
}
}
这会产生以下输出:
============ Original a ==========
A
aa
B
bb
============ Original b ==========
A
aa
B
bb
============ Copy of a ==========
A
B
aa
bb
============ Copy of b ==========
A
aa
B
bb
请注意,复制的a
的顺序与原始顺序不同,而复制的b
的顺序与原始顺序保持一致。
答案 1 :(得分:0)
嗯,在第一种情况下,维护集合元素的自然排序,而在第二种情况下,保留SortedSet
的顺序。区别因素是TreeSet
中元素的排序。
您还可以使用TreeSet
的其他构造函数设置自定义排序。
请查看文档以供进一步参考。
答案 2 :(得分:0)
TreeSet(SortedSet ss)
构造函数使用与ss
参数相同的ording,而TreeSet(Collections c)
强制使用其元素的“自然顺序”。
Docs解释了这一点。