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.csdn.net/cgsyck/article/details/108361971
3.
https://blog.csdn.net/cgsyck/article/details/108276863