import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class DuplicateCharacters { public static void main(String[] args) { String str = "programming"; Map<Character, Long> charCountMap = str.chars() // Convert to IntStream .mapToObj(c -> (char) c) // Convert int to Character .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); // Count occurrences System.out.println("Duplicate Characters:"); charCountMap.entrySet().stream() .filter(entry -> entry.getValue() > 1) // Keep only duplicates .forEach(entry -> System.out.println(entry.getKey() + " -> " + entry.getValue())); } }
Output:
Duplicate Characters: r -> 2 g -> 2 m -> 2
Alternative: Using Set
for Better Performance
import java.util.HashSet; import java.util.Set; public class DuplicateCharactersUsingSet { public static void main(String[] args) { String str = "programming"; Set<Character> uniqueChars = new HashSet<>(); Set<Character> duplicates = str.chars() .mapToObj(c -> (char) c) .filter(c -> !uniqueChars.add(c)) // Add returns false if already present .collect(Collectors.toSet()); System.out.println("Duplicate Characters: " + duplicates); } }