In this post, we will write a Java program that counts duplicate characters from a given String.
We will write the same Java programs in two ways:
- Count duplicate characters in a String using plain Java
- Count duplicate characters in a String using Java 8 features (stream and lambda).
1. Java program to count duplicate characters
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public final class Strings {
public static Map<Character, Integer> countDuplicateCharacters(String str) {
if (str == null || str.isBlank()) {
// or throw IllegalArgumentException
return Collections.emptyMap();
}
Map<Character, Integer> result = new HashMap<>();
// or use for(char ch: str.toCharArray()) { ... }
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
result.compute(ch, (k, v) -> (v == null) ? 1 : ++v);
}
return result;
}
}
Test using main() method:
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class Main {
private static final String TEXT = " Java is my fav programming language. I love Java coding";
public static void main(String[] args) {
System.out.println("HashMap based solution:");
long startTimeV1 = System.nanoTime();
Map<Character, Integer> duplicatesV1 = Strings.countDuplicateCharacters(TEXT);
displayExecutionTime(System.nanoTime()-startTimeV1);
System.out.println(Arrays.toString(duplicatesV1.entrySet().toArray()));
}
private static void displayExecutionTime(long time) {
System.out.println("Execution time: " + time + " ns" + " (" +
TimeUnit.MILLISECONDS.convert(time, TimeUnit.NANOSECONDS) + " ms)");
}
}
Output:
HashMap based solution: Execution time: 14567100 ns (14 ms) [ =10, a=8, c=1, d=1, e=2, f=1, g=5, I=1, i=3, J=2, l=2, m=3, .=1, n=3, o=3, p=1, r=2, s=1, u=1, v=4, y=1]
2. Java 8 program to count duplicate characters
import java.util.Collections;
import java.util.Map;
import java.util.stream.Collectors;
public final class Strings {
public static Map<Character, Long> countDuplicateCharacters(String str) {
if (str == null || str.isBlank()) {
// or throw IllegalArgumentException
return Collections.emptyMap();
}
Map<Character, Long> result = str.chars()
.mapToObj(c -> (char) c)
.collect(Collectors.groupingBy(c -> c, Collectors.counting()));
return result;
}
}
Test using main() method:
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class Main {
private static final String TEXT = " Java is my fav programming language. I love Java coding";
public static void main(String[] args) {
System.out.println("HashMap based solution:");
long startTimeV1 = System.nanoTime();
Map<Character, Long> duplicatesV1 = Strings.countDuplicateCharacters(TEXT);
displayExecutionTime(System.nanoTime()-startTimeV1);
System.out.println(Arrays.toString(duplicatesV1.entrySet().toArray()));
}
private static void displayExecutionTime(long time) {
System.out.println("Execution time: " + time + " ns" + " (" +
TimeUnit.MILLISECONDS.convert(time, TimeUnit.NANOSECONDS) + " ms)");
}
}
Output:
HashMap based solution:
Execution time: 26707300 ns (26 ms)
[ =10, a=8, c=1, d=1, e=2, f=1, g=5, I=1, i=3, J=2, l=2, m=3, .=1, n=3, o=3, p=1, r=2, s=1, u=1, v=4, y=1]
Free Spring Boot Tutorial | Full In-depth Course | Learn Spring Boot in 10 Hours
Watch this course on YouTube at Spring Boot Tutorial | Fee 10 Hours Full Course