From 6b9520ec73c8a6c0f83d4ec3afd2a295364ed54a Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 19 Jan 2018 18:54:33 +0300 Subject: [PATCH] KT-16661 Simplify String.split a bit more Check that limit is reached only once in a loop, move nextIndex check to the end of loop. --- libraries/stdlib/src/kotlin/text/Strings.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/stdlib/src/kotlin/text/Strings.kt b/libraries/stdlib/src/kotlin/text/Strings.kt index 7d597a8505f..196f77061d0 100644 --- a/libraries/stdlib/src/kotlin/text/Strings.kt +++ b/libraries/stdlib/src/kotlin/text/Strings.kt @@ -1212,18 +1212,19 @@ private fun CharSequence.split(delimiter: String, ignoreCase: Boolean, limit: In var currentOffset = 0 var nextIndex = indexOf(delimiter, currentOffset, ignoreCase) - if (nextIndex == -1) { + if (nextIndex == -1 || limit == 1) { return listOf(this.toString()) } val isLimited = limit > 0 val result = ArrayList(if (isLimited) limit.coerceAtMost(10) else 10) - while (nextIndex != -1 && (!isLimited || result.size < limit - 1)) { + do { result.add(substring(currentOffset, nextIndex)) currentOffset = nextIndex + delimiter.length // Do not search for next occurrence if we're reaching limit - nextIndex = if (result.size == limit - 1) break else indexOf(delimiter, currentOffset, ignoreCase) - } + if (isLimited && result.size == limit - 1) break + nextIndex = indexOf(delimiter, currentOffset, ignoreCase) + } while (nextIndex != -1) result.add(substring(currentOffset, length)) return result