summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2015-02-09 13:51:51 -0800
committerAdriaan Moors <adriaan.moors@typesafe.com>2015-02-09 13:51:51 -0800
commite8365dedf7a42382b337d644e35cb405183ed2b2 (patch)
tree5ce53cad390a6328c527eb6fa5d39dcf4b601f2b /src
parent9d09247f13b8a77c1b3a2bb5d44510b7cec38dce (diff)
parentd1d3225e28ed1847470d976ffeefbce40e90d9ac (diff)
downloadscala-e8365dedf7a42382b337d644e35cb405183ed2b2.tar.gz
scala-e8365dedf7a42382b337d644e35cb405183ed2b2.tar.bz2
scala-e8365dedf7a42382b337d644e35cb405183ed2b2.zip
Merge pull request #4209 from kanielc/SI-8988
SI-8988 Escaping character in StringLike.split(c) is slow
Diffstat (limited to 'src')
-rw-r--r--src/library/scala/collection/immutable/StringLike.scala31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/library/scala/collection/immutable/StringLike.scala b/src/library/scala/collection/immutable/StringLike.scala
index f0daaf25a5..1ead894faf 100644
--- a/src/library/scala/collection/immutable/StringLike.scala
+++ b/src/library/scala/collection/immutable/StringLike.scala
@@ -10,7 +10,7 @@ package scala
package collection
package immutable
-import mutable.Builder
+import mutable.{ ArrayBuilder, Builder }
import scala.util.matching.Regex
import scala.math.ScalaNumber
import scala.reflect.ClassTag
@@ -203,8 +203,33 @@ self =>
private def escape(ch: Char): String = "\\Q" + ch + "\\E"
- @throws(classOf[java.util.regex.PatternSyntaxException])
- def split(separator: Char): Array[String] = toString.split(escape(separator))
+ def split(separator: Char): Array[String] = {
+ val thisString = toString
+ var pos = thisString.indexOf(separator)
+
+ if (pos != -1) {
+ val res = new ArrayBuilder.ofRef[String]
+
+ var prev = 0
+ do {
+ res += thisString.substring(prev, pos)
+ prev = pos + 1
+ pos = thisString.indexOf(separator, prev)
+ } while (pos != -1)
+
+ if (prev != thisString.size)
+ res += thisString.substring(prev, thisString.size)
+
+ val initialResult = res.result()
+ pos = initialResult.length
+ while (pos > 0 && initialResult(pos - 1).isEmpty) pos = pos - 1
+ if (pos != initialResult.length) {
+ val trimmed = new Array[String](pos)
+ Array.copy(initialResult, 0, trimmed, 0, pos)
+ trimmed
+ } else initialResult
+ } else Array[String](thisString)
+ }
@throws(classOf[java.util.regex.PatternSyntaxException])
def split(separators: Array[Char]): Array[String] = {