Java集合-SortedSet

  • Post author:
  • Post category:java




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



版权声明:本文为cgsyck原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。