Travis Griggs
04/17/2023, 4:58 AM"." >>> "."
"" >>> ""
"foo" >>> "foo"
"abc.xyz.com.dat.is.cool" >>> "abc.xyzcomdatiscool"
"abc." >>> "abc."
"abc.x" >>> "abc.x"
"abc.xyz." >>> "<http://abc.xyz|abc.xyz>"
I can solve this "straightforward" style with something like this:
fun keepFirst(input:String, pariah:Char) : String {
val builder = StringBuilder()
val iter = input.iterator()
while (iter.hasNext()) {
val next = iter.next()
builder.append(next)
if (next == pariah) {
break
}
}
while (iter.hasNext()) {
val next = iter.next()
if (next != pariah) {
builder.append(next)
}
}
return builder.toString()
}
But it seems like I should be able to do something more general, more one line, more functional. I don't want to use a "findIndex" solution followed by a replace, that has to cope with edge cases. And I was hoping to do it in single pass. What I wanted was something like:
val stream = input.iterator()
return (stream.takeThrough { char == '.' } + stream.filter { char != '.' }).toString()
Or something like so, but alas, there is no takeThrough analog.Edwar D Day
04/17/2023, 6:32 AMfun main() {
val input = "abc.xyz."
val regex = "([^\\.]*)\\.?".toRegex()
val result = regex.findAll(input).withIndex().joinToString(separator = "") { (index, match) ->
if (index == 0) match.groupValues[0] else match.groupValues[1]
}
println(result)
}
Youssef Shoaib [MOD]
04/17/2023, 6:42 AMfun String.keepFirst(char: Char): String = takeWhile { it != char } + char + dropWhile { it != char }.replace("$char", "")
ephemient
04/17/2023, 8:43 AMephemient
04/17/2023, 8:50 AMfun String.keepFirst(c: Char): String =
if (c in this) {
substringBefore(c) + c + substringAfter(c).replace(c.toString(), "")
} else {
this
}
ephemient
04/17/2023, 8:53 AMfun String.keepFirst(c: Char): String {
var isFirst = true
return filter { it != c || isFirst.also { isFirst = false } }
}
ephemient
04/17/2023, 12:28 PMfun keepFirst(input: String, pariah: Char): String = buildString {
val iterator = input.iterator()
for (next in iterator) {
append(next)
if (next == pariah) break
}
for (next in iterator) {
if (next != pariah) append(next)
}
}
Travis Griggs
04/17/2023, 5:31 PM