Answer
Count Character Frequency in a String
Method 1: Using HashMap (Most Common)
Java
public static Map<Character, Integer> charFrequency(String str) {
Map<Character, Integer> freq = new LinkedHashMap<>(); // preserves insertion order
for (char c : str.toCharArray()) {
freq.put(c, freq.getOrDefault(c, 0) + 1);
}
return freq;
}
Map<Character, Integer> result = charFrequency("programming");
result.forEach((c, count) ->
System.out.println("'" + c + "' → " + count));
// 'p' → 1, 'r' → 2, 'o' → 1, 'g' → 2, 'a' → 1, 'm' → 2, 'i' → 1, 'n' → 1
Method 2: Sort Characters (Simpler Output)
Java
public static void printFrequencySorted(String str) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
int i = 0;
while (i < chars.length) {
int count = 1;
while (i + count < chars.length && chars[i + count] == chars[i]) {
count++;
}
System.out.println("'" + chars[i] + "' : " + count);
i += count;
}
}
Method 3: Java 8 Streams
Java
public static Map<Character, Long> charFrequencyStream(String str) {
return str.chars()
.mapToObj(c -> (char) c)
.collect(Collectors.groupingBy(c -> c, Collectors.counting()));
}
// Sort by frequency descending
str.chars()
.mapToObj(c -> (char) c)
.collect(Collectors.groupingBy(c -> c, Collectors.counting()))
.entrySet().stream()
.sorted(Map.Entry.<Character, Long>comparingByValue().reversed())
.forEach(e -> System.out.println("'" + e.getKey() + "': " + e.getValue()));
Find Most Frequent Character
Java
public static char mostFrequentChar(String str) {
Map<Character, Integer> freq = new HashMap<>();
for (char c : str.toCharArray()) {
freq.put(c, freq.getOrDefault(c, 0) + 1);
}
return freq.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElseThrow();
}
System.out.println(mostFrequentChar("aabbccddeeea")); // 'a' (appears 4 times)
Find First Non-Repeating Character
Java
public static char firstNonRepeating(String str) {
Map<Character, Integer> freq = new LinkedHashMap<>();
for (char c : str.toCharArray()) {
freq.put(c, freq.getOrDefault(c, 0) + 1);
}
for (Map.Entry<Character, Integer> entry : freq.entrySet()) {
if (entry.getValue() == 1) {
return entry.getKey(); // first character with count 1
}
}
return '\0'; // no non-repeating character
}
System.out.println(firstNonRepeating("aabcddee")); // 'b'
System.out.println(firstNonRepeating("aabb")); // '\0' (none found)
Remove Duplicate Characters (Keep First Occurrence)
Java
public static String removeDuplicates(String str) {
Set<Character> seen = new LinkedHashSet<>();
for (char c : str.toCharArray()) {
seen.add(c); // Set auto-deduplicates
}
StringBuilder sb = new StringBuilder();
seen.forEach(sb::append);
return sb.toString();
}
System.out.println(removeDuplicates("programming")); // "progamin"
Complete Test
Java
@Test
public void testCharFrequency() {
Map<Character, Integer> freq = charFrequency("aabb");
assertEquals(2, (int) freq.get('a'));
assertEquals(2, (int) freq.get('b'));
assertEquals('a', mostFrequentChar("aabbc")); // a appears most
assertEquals('b', firstNonRepeating("aabcdd")); // b is first non-repeating
assertEquals("abc", removeDuplicates("aabbcc")); // unique chars preserved
}
