SortedSet tailSet() method in Java

The Java Collections Framework's `SortedSet` interface offers a total ordering of elements, with a key method called `tailSet(E fromElement)`. The method allows developers to access or manipulate elements greater than or equal to a specified element, supporting additional operations and ensuring data integrity.The `tailSet(E fromElement)` method in Java's `SortedSet` interface creates a view encompassing elements greater than or equal to a specified `fromElement`. The method extends the Set interface's functionality by imposing a total ordering on its elements. The returned view is a SortedSet, preserving the order of elements and supporting additional operations. The `tailSet` view enforces the specified range to maintain data integrity, preventing any attempt to insert an element outside the range.

For a better understanding, consider the following example.

FileName:TailSetExample.java

import java.util.SortedSet;

import java.util.TreeSet;

public class TailSetExample {

    public static void main(String[] args) {

        // Input: Create a TreeSet and add elements

        SortedSet<Integer> sortedSet = new TreeSet<>();

        sortedSet.add(10);

        sortedSet.add(20);

        sortedSet.add(30);

        sortedSet.add(40);

        sortedSet.add(50);

        // Input: Use tailSet() to get a view of the set from a specific element onwards

        SortedSet<Integer> tailSet = sortedSet.tailSet(30);

        // Output: Print the original set and the tailSet

        System.out.println("Original Set: " + sortedSet);

        System.out.println("Tail Set (from 30 onwards): " + tailSet);

        // Input: Attempt to insert an element outside the range

        try {

            tailSet.add(25);

        } catch (IllegalArgumentException e) {

            // Output: Display the caught IllegalArgumentException

            System.out.println("Caught an IllegalArgumentException: " + e.getMessage());

        }

        // Output: Confirm that the original set and tailSet remain unchanged

        System.out.println("Original Set (unchanged): " + sortedSet);

        System.out.println("Tail Set (unchanged): " + tailSet);

    }

}

Output:

Original Set: [10, 20, 30, 40, 50]

Tail Set (from 30 onwards): [30, 40, 50]

Caught an IllegalArgumentException: key out of range

Original Set (unchanged): [10, 20, 30, 40, 50]

Tail Set (unchanged): [30, 40, 50]

Explanation: The above code creates a TreeSet named `sortedSet`, which automatically maintains elements in sorted order. It uses the `tailSet()` method to create a view of the sortedSet containing elements greater than or equal to 30. The original set and tailSet are printed to the console. An attempt to insert an element outside the range is wrapped in a try-catch block, and if caught, an IllegalArgumentException is displayed. The original set and tailSet remain unchanged after the exception is caught.

Exceptions Thrown 

The `tailSet()` method in Java's `SortedSet` interface, when implemented by classes like `TreeSet`, does not throw its own exceptions during creation. However, modifications to the returned tail set may throw exceptions based on the specific set implementation. Some exceptions include `NullPointerException`, `ClassCastException`, and `IllegalArgumentException`. Handling these exceptions depends on the specific use case and program requirements.

1. NullPointerException: 

If an attempt is made to invoke the tailSet() method on a null reference, a NullPointerException may be raised.

FileName:TreeSetNullPointerExceptionExample.java

import java.util.SortedSet;

import java.util.TreeSet;

public class TreeSetNullPointerExceptionExample {

    public static void main(String[] args) {

        // Attempting to create a tailSet on a null reference

        SortedSet<Integer> nullSet = null;

        try {

            SortedSet<Integer> tailSet = nullSet.tailSet(3); // This line will throw a NullPointerException

            System.out.println("Tail Set: " + tailSet);

        } catch (NullPointerException e) {

            System.out.println("Caught NullPointerException: " + e.getMessage());

        }

    }

}

Output:

Caught NullPointerException: Cannot invoke "java.util.SortedSet.tailSet(Object)" because "<local1>" is null

Explanation: The above code creates a `nullSet` and attempts to create a `tailSet` on a `nullSet` reference, causing a `NullPointerException`. The code is wrapped in a `try-catch` block to handle the expected exception. If a `NullPointerException` is thrown, the catch block is executed, and a message is printed to the console. If an exception is thrown, the catch block is executed, and a message is printed to the console.

2. ClassCastException: 

It's crucial to make clear that, in the context of tailSet(), ClassCastException is usually connected to attempts to add elements of different types to a collection rather than being specifically related to the tailSet() function. When used appropriately with compatible types, the tailSet() method itself does not throw ClassCastExceptions.

3. IllegalArgumentException: 

The tailSet() method may raise the IllegalArgumentException if we attempt to insert an element that conflicts with the ordering defined by the SortedSet or TreeSet. An exception is raised if the specified element is not within the set's defined range. 

FileName:TreeSetIllegalArgumentExceptionExample.java

import java.util.SortedSet;

import java.util.TreeSet;

public class TreeSetIllegalArgumentExceptionExample {

    public static void main(String[] args) {

        // Creating a TreeSet with elements

        TreeSet<Integer> treeSet = new TreeSet<>();

        treeSet.add(10);

        treeSet.add(20);

        treeSet.add(30);

        treeSet.add(40);

        treeSet.add(50);

        // Using tailSet to get a view of the set from a specific element onwards

        SortedSet<Integer> tailSet = treeSet.tailSet(30);

        System.out.println("Original Set: " + treeSet);

        System.out.println("Tail Set (from 30 onwards): " + tailSet);

        try {

            // Attempting to insert an element outside the specified range

            tailSet.add(25); // This line will throw an IllegalArgumentException

        } catch (IllegalArgumentException e) {

            System.out.println("Caught IllegalArgumentException: " + e.getMessage());

        }

    }

}

Output:

Original Set: [10, 20, 30, 40, 50]

Tail Set (from 30 onwards): [30, 40, 50]

Caught IllegalArgumentException: key out of range

Explanation: The IllegalArgumentException occurs when an element is not compatible with the ordering defined by the SortedSet or TreeSet, thrown when it is outside the set's range. The above example explains that when a TreeSet is created with elements greater than or equal to 30 and an element (25) is inserted outside the specified range, resulting in an IllegalArgumentException.