How to display string letters sorted by frequency in Kotlin

1 Answer

0 votes
// Pair structure: (letter, frequency)
data class Pair(val letter: Char, val freq: Int)

// sortByFrequency — counts how often each letter appears and returns a sorted list
fun sortByFrequency(s: String): List<Pair> {
    // Create a frequency array for 26 lowercase letters, initialized to 0
    val freq = IntArray(26)

    // Iterate through the string and count only alphabetic characters
    for (c in s) {
        if (c.isLetter()) {
            val lower = c.lowercaseChar()
            val index = lower.code - 'a'.code
            freq[index]++
        }
    }

    // Build a list of (letter, frequency) pairs
    val result = List(26) { i ->
        Pair(('a'.code + i).toChar(), freq[i])
    }

    // Sort pairs by frequency in descending order
    return result.sortedByDescending { it.freq }
}

// Build a string sorted by frequency: ddddddddddddccccccbbbbbaaaafffeehhgs
fun buildSortedString(sorted: List<Pair>): String {
    val out = StringBuilder()

    for (p in sorted) {
        // append 'p.letter' repeated p.freq times
        if (p.freq > 0) {
            out.append(p.letter.toString().repeat(p.freq))
        }
    }

    return out.toString()
}

fun main() {
    // Input text to analyze
    val text = "bbcabddddccafffadbbcdccsedddddhhgade"

    // Get sorted frequency list
    val sorted = sortByFrequency(text)

    // Print each letter and its frequency
    for (p in sorted) {
        if (p.freq != 0) {
            println("${p.letter}: ${p.freq}")
        }
    }

    // Print the reconstructed sorted string
    val lettersSortedByFrequency = buildSortedString(sorted)
    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

*/

 



answered 2 days ago by avibootz

Related questions

...