import java.net.URLDecoder
import java.nio.charset.StandardCharsets
/**
* Parses and decodes a complete URL query string into a Map.
* Groups duplicate keys into a List of values.
*/
fun parseAndDecodeQuery(queryString: String): Map<String, List<String>> {
// Remove leading '?' if present
val cleanQuery = if (queryString.startsWith("?")) queryString.drop(1) else queryString
if (cleanQuery.isEmpty()) {
return emptyMap()
}
// Split query by '&' into individual key-value pairs, decode them, and group by key
return cleanQuery.split("&")
.map { param ->
val parts = param.split("=", limit = 2)
val key = URLDecoder.decode(parts[0], StandardCharsets.UTF_8.name())
val value = if (parts.size > 1) {
URLDecoder.decode(parts[1], StandardCharsets.UTF_8.name())
} else {
""
}
key to value
}
.groupBy({ it.first }, { it.second })
}
fun main() {
val fullQuery = "search=kotlin+tutorial&category=programming&tag=beginner&tag=android"
println("--- Full Query String Parsing ---")
println("Original Query: $fullQuery")
val decodedMap = parseAndDecodeQuery(fullQuery)
println("Decoded Map Result:")
decodedMap.forEach { (key, values) ->
println(" $key -> $values")
}
}
/*
run:
--- Full Query String Parsing ---
Original Query: search=kotlin+tutorial&category=programming&tag=beginner&tag=android
Decoded Map Result:
search -> [kotlin tutorial]
category -> [programming]
tag -> [beginner, android]
*/