Java SortedSet
Jakob Jenkov |
The Java SortedSet interface, java.util.SortedSet, is a subtype of the
java.util.Set interface. The Java SortedSet interface behaves like
a normal Set with the exception that the elements it contains are sorted internally. This means
that when you iterate the elements of a SortedSet the elements are
iterated in the sorted order.
The TreeSet SortedSet Implementation
The Java Collections API only has one implementation of the Java SortedSet interface -
the java.util.TreeSet class. The java.util.concurrent package also
has an implementation of this interface, but I will leave the concurrency utilities out of
this trail.
Create a TreeSet
Here is an example of creating a Java TreeSet instance:
SortedSet sortedSet = new TreeSet();
Create a TreeSet With a Comparator
It it possible to pass a Comparator, java.util.Comparator implementation to the
constructor of the TreeSet. This Comparator will then decide the ordering of the elements
in the TreeSet. Here is an example of creating a Java SortedSet with a
Comparator:
Comparator comparator = new MyComparatorImpl(); SortedSet sortedSet = new TreeSet(comparator);
Sort Order
The default sort order used by a Java SortedSet is the natural
sorting order of the elements. For the SortedSet to be able to determine the natural
order of the elements, the elements must implement the java.lang.Comparable interface.
If the elements do not implement the Comparable interface, the elements have no natural ordering.
In that case you must pass a Comparator implementation to the SortedSet when you
create it. The TreeSet class can take a Comparator in its constructor. Here is an
example of creating a Java TreeSet with a Comparator:
Comparator comparator = new MyComparator(); SortedSet sortedSet = new TreeSet(comparator);
Ascending vs. Descending Sort Order
By default the elements of a SortedSet are iterated in ascending order, starting with the "smallest"
and moving towards the "largest". But it is also possible to iterate the elements in descending order using
the method TreeSet.descendingIterator(). Here is an example of iterating the elements of a
TreeSet in descending order:
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);
}
Get Comparator Used
If you created your SortedSet with a Comparator, you can obtain that Comparator
via the SortedSet comparator() method. Here is an example of obtaining the
Comparator used by a SortedSet via the comparator() method:
Comparator comparator = sortedSet.comparator();
Add Elements
You add elements to a Java SortedSet in the same way you do with a normal Java Set
- via its add() method. Here is an example of adding an element to a Java SortedSet:
SortedSet sortedSet = new TreeSet();
sortedSet.add("one");
Remove Elements
To remove an element from a SortedSet you call its remove() method, passing the
element to remove as parameter. Here is an example of removing an element from a Java SortedSet:
sortedSet.remove("one");
Get First Element
You can get the first element of a SortedSet according to its sort order
by calling the first() method of the SortedSet. Here is an example of obtaining the
first element from a Java SortedSet according to its sort order:
Object firstElement = sortedSet.first();
Get Last Element
You can get the last element of a SortedSet according to its sort order
by calling the last() method of the SortedSet. Here is an example of obtaining the
last element from a Java SortedSet according to its sort order:
Object lastElement = sortedSet.last();
Iterate a SortedSet
The way you iterate the elements of a Java SortedSet is the same way you iterate a normal
Java Set. You call the SortedSet iterator() method which returns
an Iterator, and then you can iterate the elements via that. Here is an example of iterating
the elements of a Java SortedSet:
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);
}
Get Head Set
The Java SortedSet interface has a method named headSet() which returns another
SortedSet with all elements that are smaller than (ahead of) a given parameter value,
according to the sort order used by the SortedSet. Here
is an example of obtaining a head set from a Java SortedSet via its headSet() method:
SortedSet sortedSet = new TreeSet();
sortedSet.add("a");
sortedSet.add("b");
sortedSet.add("c");
sortedSet.add("d");
sortedSet.add("e");
SortedSet headSet = sortedSet.headSet("c");
After running this code the headSet will contain the elements "a" and "b"
since these two elements are smaller than (ahead of) the parameter value "c" that was passed
to the headSet() method.
Get Tail Set
The Java SortedSet interface has a method named setSet() which returns another
SortedSet with all elements that are greater than or equal to (tailing) a given parameter value,
according to the sort order used by the SortedSet. Here
is an example of obtaining a tail set from a Java SortedSet via its tailSet() method:
SortedSet sortedSet = new TreeSet();
sortedSet.add("a");
sortedSet.add("b");
sortedSet.add("c");
sortedSet.add("d");
sortedSet.add("e");
SortedSet tailSet = sortedSet.tailSet("c");
After running this code the tailSet will contain the elements "c", "d"
and "e", since these three elements are greater than or equal to (tailing) the parameter value
"c" that was passed to the tailSet() method.
Get Subset
The Java SortedSet interface has a method named subSet() method which will return
a new SortedSet which is a subset of the SortedSet the subSet() method
is called on. The subSet() method takes two parameter values which specify what elements the
returned SortedSet should contain. The returned subset will contain all elements equal to or
greater than the first parameter, and smaller than the second parameter, according to the sort order used
by the SortedSet. Here is an example of obtaining a
subset of a Java SortedSet via its subSet() method:
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");
After running this code the subSet will contain the elements "c" and "d",
since bother are equal to or greather than "c" (first parameter), and less than "e"
(second parameter).
Generic SortedSet
When you declare a variable of type SortedSet, you can set a generic type on it. For more information
about Java generics, see my Java Generics tutorial. Here is an example
of setting a generic type on a SortedSet:
SortedSet<String> sortedSet = new TreeSet<>();
This SortedSet can now only contain Java String objects as elements.
Among other things, this means that you no longer need to cast the objects obtained from the SortedSet
to String. Here is an example of iterating a SortedSet of generic type 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);
}
Notice how there is no longer a cast of the object returned from iterator.next() needed.
Because the generic type of the SortedSet is String, the compiler knows that the iterator is an
Iterato<String>, so next() return String objects.
| Tweet | |
Jakob Jenkov | |











