// Pair structure: (letter, frequency)
case class Pair(letter: Char, freq: Int)
// sortByFrequency — counts how often each letter appears and returns a sorted list
def sortByFrequency(s: String): Vector[Pair] = {
// Create a frequency array for 26 lowercase letters, initialized to 0
val freq = Array.fill(26)(0)
// Iterate through the string and count only alphabetic characters
for (c <- s) {
if (c.isLetter) {
val lower = c.toLower
val index = lower - 'a'
freq(index) += 1
}
}
// Build a vector of (letter, frequency) pairs
val result = (0 until 26).map { i =>
Pair(('a' + i).toChar, freq(i))
}.toVector
// Sort pairs by frequency in descending order
result.sortBy(p => -p.freq)
}
// Build a string sorted by frequency: ddddddddddddccccccbbbbbaaaafffeehhgs
def buildSortedString(sorted: Vector[Pair]): String = {
val builder = new StringBuilder
for (p <- sorted) {
// append 'p.letter' repeated p.freq times
if (p.freq > 0) {
builder.append(p.letter.toString * p.freq)
}
}
builder.toString
}
@main def main(): Unit = {
// Input text to analyze
val text = "bbcabddddccafffadbbcdccsedddddhhgade"
// Get sorted frequency list
val sorted = sortByFrequency(text)
// Print each letter and its frequency
for (p <- sorted) {
if (p.freq != 0)
println(s"${p.letter}: ${p.freq}")
}
// Print the reconstructed sorted string
val lettersSortedByFrequency = buildSortedString(sorted)
println()
println(s"Sorted string: $lettersSortedByFrequency")
}
/*
run:
d: 12
c: 6
b: 5
a: 4
f: 3
e: 2
h: 2
g: 1
s: 1
Sorted string: ddddddddddddccccccbbbbbaaaafffeehhgs
*/