import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class LetterFrequency {
// Pair structure: (letter, frequency)
static class Pair {
char letter;
int freq;
Pair(char letter, int freq) {
this.letter = letter;
this.freq = freq;
}
}
// sortByFrequency — counts how often each letter appears and returns a sorted list
public static ArrayList<Pair> sortByFrequency(String s) {
int[] freq = new int[26]; // frequency array for 26 lowercase letters
// Iterate through the string and count only alphabetic characters
for (char c : s.toCharArray()) {
if (Character.isLetter(c)) {
freq[Character.toLowerCase(c) - 'a']++;
}
}
// Build a list of (letter, frequency) pairs
ArrayList<Pair> result = new ArrayList<>();
for (int i = 0; i < 26; i++) {
result.add(new Pair((char) ('a' + i), freq[i]));
}
// Sort pairs by frequency in descending order
Collections.sort(result, new Comparator<Pair>() {
@Override
public int compare(Pair a, Pair b) {
return Integer.compare(b.freq, a.freq); // descending
}
});
return result;
}
// Build a string sorted by frequency: ddddddddddddccccccbbbbbaaaafffeehhgs
public static String buildSortedString(ArrayList<Pair> sorted) {
StringBuilder out = new StringBuilder();
for (Pair p : sorted) {
// append 'p.letter' repeated p.freq times
for (int i = 0; i < p.freq; i++) {
out.append(p.letter);
}
}
return out.toString();
}
public static void main(String[] args) {
// Input text to analyze
String text = "bbcabddddccafffadbbcdccsedddddhhgade";
// Get sorted frequency list
ArrayList<Pair> sorted = sortByFrequency(text);
// Print each letter and its frequency
for (Pair p : sorted) {
if (p.freq != 0)
System.out.println(p.letter + ": " + p.freq);
}
// Print the reconstructed sorted string
String lettersSortedByFrequency = buildSortedString(sorted);
System.out.println("\nSorted string: " + lettersSortedByFrequency);
}
}
/*
run:
d: 12
c: 6
b: 5
a: 4
f: 3
e: 2
h: 2
g: 1
s: 1
Sorted string: ddddddddddddccccccbbbbbaaaafffeehhgs
*/