I have a string and I want to split it based on the & and =
kit=xxxx&accountType=xxxxx&accountId=1234
I want accountId and it's value 1234 out of it. I have tried the below approach and feel it has more time complexity.
Could you please suggest better approach?
myString = "kit=xxxx&accountType=xxxxx&accountId=1234"
val queryComponents: List<String>? = myString?.split("&")?.map { it }
queryComponents?.forEach { element ->
if (element.contains(key)) {
val search = element.split("=").map { it }
print("key = " search[0] "value = " search[1])
}
}
CodePudding user response:
Your approach is fine, but your code is pretty hard to read. We can split by & first and then by = which is probably the easiest to understand:
val accountId = myString.splitToSequence('&')
.map { it.split('=') }
.find { it[0] == "accountId" }
?.get(1)
Or we can split only once and then search for = using string utils. This could be a little faster as we don't create additional lists of strings:
val accountId = myString.splitToSequence('&')
.find { it.startsWith("accountId=") }
?.takeLastWhile { it != '=' }
Note that by using splitToSequence() we split by & only until we find accountId=. Then we end the loop.
It could be even faster to not split at all and just search the string for &accountId=. Or use regular expressions. It would require to take into account multiple cases: accountId= is at the beginning, at the end or in the middle.
Anyway, I believe all these solutions have exactly the same time complexity of O(n).
CodePudding user response:
val myString = "kit=xxxx&accountType=xxxxx&accountId=1234"
val components = myString
.split("&", "=", ignoreCase = true)
.chunked(2) { it[0] to it[1] }
.toMap()
println(components["accountId"])
