SortedSet(java.util.SortedSet
)是Set接口的子类
,Sortedset接口的行为类似于普通Set,但它包含的元素是在内部排序的, 这意味着,当迭代SortedSet的元素时,这些元素将按排序的顺序进行迭代。
SortedSet的实现TreeSet
Collections API中SortedSet
中只有一个实现java.util.TreeSet
类,java.util.concurrent也有此接口的一个实现java.util.concurrent.
ConcurrentSkipListSet
。
创建TreeSet
下面是创建TreeSet
的例子:
SortedSet sortedSet = new TreeSet();
Comparator 作为参数创建TreeSet
创建TreeSet时,可以将Comparator
作为构造函数的参数,Comparator
将觉得元素在TreeSet中的排序,下面是例子:
Comparator comparator = new MyComparatorImpl();
SortedSet sortedSet = new TreeSet(comparator);
排序顺序
SortedSet
默认的排序顺序是自然顺序,为了使SortedSet能够确定元素的自然顺序,元素必须实现java.lang.Comparable接口
。如果元素没有实现Comparable
接口,那么元素没有自然顺序。另外一种就是,当创建TreeSet时必须将Comparator
的实现作为参数,下面是代码:
Comparator comparator = new MyComparator();
SortedSet sortedSet = new TreeSet(comparator);
升序与倒序排序
SortedSet
默认的迭代顺序是升序排序,开始是最小的元素,慢慢变大。但是可以通过TreeSet.descendingIterator()
编程降序排序,下面是降序排序的例子:
TreeSet treeSet = new TreeSet();
treeSet.add("one");
treeSet.add("two");
treeSet.add("three");
Iterator iterator = treeSet.descendingIterator();
while(iterator.hasNext()) {
String element = (String) iterator.next();
System.out.println(element);
}
获取Comparator
如果创建 SortedSet
时使用了
Comparator
参数,那么可以通过SortedSet
的comparator()
方法获取Comparator
,下面是例子:
Comparator comparator = sortedSet.comparator();
增加元素
和普通的Set一样通过add()方法增加元素:
SortedSet sortedSet = new TreeSet();
sortedSet.add("one");
移除元素
可以通过remove()
方法移除元素:
sortedSet.remove("one");
获取第一个元素
可以通过first()
方法获取SortedSet
中排序顺序的第一个元素:
Object firstElement = sortedSet.first();
获取最后一个元素
可以通过last()
方法获取SortedSet
中排序顺序的最后一个元素:
Object lastElement = sortedSet.last();
迭代SortedSet
SortedSet
的迭代和普通的Set迭代一样, SortedSet
的iterator()
方法返回一个Iterator
,然后可以通过这个Iterator
迭代元素,下面是例子:
SortedSet sortedSet = new TreeSet();
sortedSet.add("one");
sortedSet.add("two");
sortedSet.add("three");
Iterator iterator = sortedSet.iterator();
while(iterator.hasNext()) {
String element = (String) iterator.next();
System.out.println(element);
}
获取前面的Set
SortedSet
接口的
headSet()
方法,可以返回小于当前元素的
新的SortedSet
,下面是代码:
SortedSet sortedSet = new TreeSet();
sortedSet.add("a");
sortedSet.add("b");
sortedSet.add("c");
sortedSet.add("d");
sortedSet.add("e");
SortedSet headSet = sortedSet.headSet("c");
执行完代码后,headSet
包含
"a"
和 "b"
,因为这两个元素小于"c"
。
获取后面的Set
SortedSet
接口中tailSet()方法可以返回一个大于等于给定参数元素的
SortedSet
,下面是代码:
SortedSet sortedSet = new TreeSet();
sortedSet.add("a");
sortedSet.add("b");
sortedSet.add("c");
sortedSet.add("d");
sortedSet.add("e");
SortedSet tailSet = sortedSet.tailSet("c");
执行完后 tailSet
中包含
"c"
, "d"
和"e"
,因为这三个元素大于等于"c"
。
获取子集
SortedSet
接口有个subSet()方法,这个方法返回SortedSet
的子集,有两个参数,大于等于第一个参数,小于第二个参数:
SortedSet sortedSet = new TreeSet();
sortedSet.add("a");
sortedSet.add("b");
sortedSet.add("c");
sortedSet.add("d");
sortedSet.add("e");
SortedSet subSet = sortedSet.subSet("c", "e");
执行完代码后,subSet
包含"c"
和"d"
,因为这两个元素大于等于"c"
(第一个参数),小于"e"
(第二个参数)。
SortedSet的泛型
定义SortedSet
是可以使用泛型:
SortedSet<String> sortedSet = new TreeSet<>();
这个SortedSet
中只能包含String类型的元素,也就是意味着获取元素时不需要再强制类型转换,下面是代码:
SortedSet<String> sortedSet = new TreeSet<>();
sortedSet.add("one");
sortedSet.add("two");
sortedSet.add("three");
Iterator iterator = sortedSet.iterator();
while(iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
注意这儿iterator.next()
返回的不许要再强制类型转换,因为使用了泛型。
参考:1. http://tutorials.jenkov.com/java-collections/sortedset.html
2.https://blog.youkuaiyun.com/cgsyck/article/details/108361971
3.https://blog.youkuaiyun.com/cgsyck/article/details/108276863