import java.net.URLDecoder
import java.nio.charset.StandardCharsets
object QueryStringParserApp {
/**
* Parses and decodes a full URL query string into a Map.
*
* @param queryString The query string (with or without leading '?').
* @return A Map where each key maps to a list of decoded values.
*/
def parseAndDecodeQuery(queryString: String): Map[String, List[String]] = {
// Remove leading '?' if present
val cleanQuery = if (queryString.startsWith("?")) queryString.drop(1) else queryString
cleanQuery.split("&")
.filter(_.nonEmpty)
.map { param =>
param.split("=", 2) match {
case Array(k, v) =>
val decodedKey = URLDecoder.decode(k, StandardCharsets.UTF_8.name())
val decodedVal = URLDecoder.decode(v, StandardCharsets.UTF_8.name())
(decodedKey, decodedVal)
case Array(k) =>
val decodedKey = URLDecoder.decode(k, StandardCharsets.UTF_8.name())
(decodedKey, "")
}
}
.groupBy(_._1)
.view
.mapValues(_.map(_._2).toList)
.toMap
}
def main(args: Array[String]): Unit = {
val fullQuery = "search=scala+tutorial&category=programming&tag=beginner&tag=functional"
println("--- Full Query String Parsing ---")
println(s"Original Query: $fullQuery")
val result = parseAndDecodeQuery(fullQuery)
println("Decoded Map Result:")
result.foreach { case (key, values) =>
println(s" $key -> $values")
}
}
}
/*
run:
--- Full Query String Parsing ---
Original Query: search=scala+tutorial&category=programming&tag=beginner&tag=functional
Decoded Map Result:
search -> List(scala tutorial)
tag -> List(beginner, functional)
category -> List(programming)
*/