How to display string letters sorted by frequency in Scala

1 Answer

0 votes
// 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

*/

 



answered 2 days ago by avibootz

Related questions

...