SortedSet(java.util.SortedSet)是Set接口的子类,Sortedset接口的行为类似于普通Set,但它包含的元素是在内部排序的, 这意味着,当迭代SortedSet的元素时,这些元素将按排序的顺序进行迭代。
Collections API中SortedSet 中只有一个实现java.util.TreeSet类,java.util.concurrent也有此接口的一个实现java.util.concurrent. ConcurrentSkipListSet。
下面是创建TreeSet的例子:
SortedSet sortedSet = new 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); }
如果创建 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 的迭代和普通的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); }
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" 。
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<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