diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2015-02-09 13:51:51 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2015-02-09 13:51:51 -0800 |
commit | e8365dedf7a42382b337d644e35cb405183ed2b2 (patch) | |
tree | 5ce53cad390a6328c527eb6fa5d39dcf4b601f2b /src/library | |
parent | 9d09247f13b8a77c1b3a2bb5d44510b7cec38dce (diff) | |
parent | d1d3225e28ed1847470d976ffeefbce40e90d9ac (diff) | |
download | scala-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/library')
-rw-r--r-- | src/library/scala/collection/immutable/StringLike.scala | 31 |
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] = { |