Filter Set in Java
In this post, we’ll illustrate how to filter set in Java.
1. Java 7 and less
In Java 7 and less, we can iterate over the set using an advanced for-loop and filter elements using a conditional statement.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import java.util.HashSet; import java.util.Arrays; import java.util.Set; class Main { public static void main(String[] args) { Set<String> set = new HashSet<>(Arrays.asList("C", "C++", "Java", "C#")); // Java 7 and less: // create an empty set Set<String> filteredSet = new HashSet<>(); // iterate through the set for (String s: set) { // filter languages that start with `C` if (s.startsWith("C")) { filteredSet.add(s); } } System.out.println(filteredSet); } } |
Output:
[C#, C++, C]
The above solution creates a new set for filtered values. We can apply a filter to the same set using an iterator. The following code uses the remove() method provided by the Iterator class to filter elements from the same set.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import java.util.HashSet; import java.util.Arrays; import java.util.Iterator; import java.util.Set; class Main { public static void main(String[] args) { Set<String> set = new HashSet<>(Arrays.asList("C", "C++", "Java", "C#")); // Java 7 and less: // get an iterator to the set Iterator<String> itr = set.iterator(); // iterate through the set while (itr.hasNext()) { String curr = itr.next(); // filter languages that start with `C` if (!curr.startsWith("C")) { itr.remove(); } } System.out.println(set); } } |
Output:
[C#, C++, C]
Please note that ConcurrentModificationException will be thrown if the remove() method of Set interface is used as it is not permitted to modify a set while iterating over it except by iterator’s own remove method.
2. Java 8 and above
In Java 8 and above, we can convert the set into a stream and filter it using the filter() method provided by Stream. Finally, we collect the filtered elements in a String.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; class Main { public static void main(String[] args) { Set<String> set = new HashSet<>(Arrays.asList("C", "C++", "Java", "C#")); // Java 8 and above: String filteredSet = set.stream() .filter(s -> s.startsWith("C")) .collect(Collectors.joining(", ", "[", "]")); System.out.println(filteredSet); } } |
Output:
[C#, C++, C]
We can also convert the filtered stream back to a set by using a set collector.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; class Main { public static void main(String[] args) { Set<String> set = new HashSet<>(Arrays.asList("C", "C++", "Java", "C#")); // Java 8 and above: Set<String> filteredSet = set.stream() .filter(s -> s.startsWith("C")) .collect(Collectors.toSet()); System.out.println(filteredSet); } } |
Output:
[C#, C++, C]
This is equivalent to:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.StringJoiner; class Main { public static void main(String[] args) { Set<String> set = new HashSet<>(Arrays.asList("C", "C++", "Java", "C#")); StringJoiner joiner = new StringJoiner(", ", "[", "]"); for (String s : set) { if (s.startsWith("C")) { joiner.add(s); } } String filteredSet = joiner.toString(); System.out.println(filteredSet); } } |
Output:
[C#, C++, C]
That’s all about filtering Set in Java.
Thanks for reading.
To share your code in the comments, please use our online compiler that supports C, C++, Java, Python, JavaScript, C#, PHP, and many more popular programming languages.
Like us? Refer us to your friends and support our growth. Happy coding :)