Java.util.TreeSet Example
In this example we will see how and when to use java.util.TreeSet
. A TreeSet
is a set implementation which provides total ordering on its elements. The elements are ordered using their natural ordering, or by a Comparator typically provided at sorted set creation time.
A TreeSet
is typically used when we want to keep the elements sorted all times. A TreeSet
is a NavigableSet
implementation based on a TreeMap
. A TreeMap
has Red-Black tree implemented which insures log(n)
time cost for the basic operations (add, remove and contains).
Lets see how we can use TreeSet
in different ways :
1. Sorting Order for Primitives (with Wrapper class)
TreeSet
guarantees that the elements inserted remains sorted, lets try to insert some Integers and see the result.
JavaTreeSetExample.java
package com.jcg.example; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class JavaTreeSetExample { public static void main(String[] args) { //Putting Integers in sorted order Set integerSet = new TreeSet(); integerSet.add(new Integer(17)); integerSet.add(new Integer(1)); integerSet.add(new Integer(4)); integerSet.add(new Integer(9)); System.out.println(integerSet.toString()); } }
Output :
[1, 4, 9, 17]
2. Natural order of Custom classes using Comparable
Now lets see how we can ensure order of custom classes using Comparable
. For this example we will use a User
class and implement Comparable
.
User.java
package com.jcg.example; public class User implements Comparable { private String firstName; private String lastName; private int salary; public User(String firstName, String lastName, int salary) { super(); this.firstName = firstName; this.lastName = lastName; this.salary = salary; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } @Override public String toString() { return firstName + " " + lastName + " " + salary; } @Override public int compareTo(User o) { return this.firstName.compareTo(o.firstName); } }
Here we have overridden compareTo
method which sorts the users based on first name. Lets see how this will work :
JavaTreeSetExample.java
package com.jcg.example; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class JavaTreeSetExample { public static void main(String[] args) { //Putting Custom Objects in Sorted Order Set userSet = new TreeSet(); populateUser(userSet); System.out.println("** Users based on first Name **"); System.out.println(userSet.toString()); //Iterating over TreeSet using for loop System.out.println("** Iterating using for loop **"); for(User user : userSet){ System.out.println(user.getFirstName()); } //Iterating over TreeSet using Iterator System.out.println("** Iterating using Iterator **"); Iterator iterator = userSet.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } private static void populateUser(Set userSet) { userSet.add(new User("Anirudh","Bhatnagar",100)); userSet.add(new User("Jack","Daniel",150)); userSet.add(new User("Kate","Xyz",120)); userSet.add(new User("Bosco","Ceasor",140)); } }
Output:
** Users based on first Name ** [Anirudh Bhatnagar 100, Bosco Ceasor 140, Jack Daniel 150, Kate Xyz 120] ** Iterating using for loop ** Anirudh Bosco Jack Kate ** Iterating using Iterator ** Anirudh Bhatnagar 100 Bosco Ceasor 140 Jack Daniel 150 Kate Xyz 120
So, In the above example we can see that the users are sorted based on the first name.
Also, we can see different ways of iterating over TreeSet
in the same example above. (For loop and Iterator)
3. Sorting Order Using Comparator
Finally, we will see how we can use a Comparator
with TreeSet
to achieve ordering based on a criteria other than natural sorting. In our example we will create a comparator
that sorts the TreeSet
based on the salaries of users.
First, we will make a comparator
:
UserSalaryComparator.java
package com.jcg.example; import java.util.Comparator; public class UserSalaryComparator implements Comparator { // This compares employees based on salaries @Override public int compare(User o1, User o2) { if (o1.getSalary() >= o2.getSalary()) { return 1; } else { return -1; } } }
Next, We will pass this Comparator
as an argument while creating the TreeSet
to apply this Comparator
.
JavaTreeSetExample.java
package com.jcg.example; import java.util.Set; import java.util.TreeSet; public class JavaTreeSetExample { public static void main(String[] args) { Set userSetBasedOnSalary = new TreeSet(new UserSalaryComparator()); populateUser(userSetBasedOnSalary); System.out.println("** Users based on salary **"); System.out.println(userSetBasedOnSalary.toString()); } private static void populateUser(Set userSet) { userSet.add(new User("Anirudh","Bhatnagar",100)); userSet.add(new User("Jack","Daniel",150)); userSet.add(new User("Kate","Xyz",120)); userSet.add(new User("Bosco","Ceasor",140)); } }
Output :
** Users based on salary ** [Anirudh Bhatnagar 100, Kate Xyz 120, Bosco Ceasor 140, Jack Daniel 150]
So, here we see the output is sorted in increasing order of salaries of users.
Download the Eclipse project of this tutorial
In this example we saw how to use a TreeSet
in different ways.
You can download the full source code of this example here : JavaTreeSetExample.zip