diff options
author | Elliott Hughes <enh@google.com> | 2010-06-24 14:52:40 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2010-06-24 14:52:40 -0700 |
commit | 870b23b3febc851c9cd2321f82a9971a34093e77 (patch) | |
tree | ea7196e11cdfca5194adc5f6bea5931ae5b32cc0 /luni/src/main/java | |
parent | 095cbb8709ed62713b64f8dfe91164507ac7a65b (diff) | |
download | libcore-870b23b3febc851c9cd2321f82a9971a34093e77.zip libcore-870b23b3febc851c9cd2321f82a9971a34093e77.tar.gz libcore-870b23b3febc851c9cd2321f82a9971a34093e77.tar.bz2 |
Fix String.replace("", _).
Bug: http://code.google.com/p/android/issues/detail?id=8807
Change-Id: Id587df266a547ff17db4dbb32493bed394a7c51e
Diffstat (limited to 'luni/src/main/java')
-rw-r--r-- | luni/src/main/java/java/lang/String.java | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/luni/src/main/java/java/lang/String.java b/luni/src/main/java/java/lang/String.java index d74b19e..df8da94 100644 --- a/luni/src/main/java/java/lang/String.java +++ b/luni/src/main/java/java/lang/String.java @@ -1542,7 +1542,6 @@ outer: * @return a new string with occurrences of oldChar replaced by newChar. */ public String replace(char oldChar, char newChar) { - // BEGIN endroid-changed char[] buffer = value; int _offset = offset; int _count = count; @@ -1566,7 +1565,6 @@ outer: } return copied ? new String(0, count, buffer) : this; - // END android-changed } /** @@ -1584,30 +1582,47 @@ outer: */ public String replace(CharSequence target, CharSequence replacement) { if (target == null) { - throw new NullPointerException("target should not be null"); + throw new NullPointerException("target == null"); } if (replacement == null) { - throw new NullPointerException("replacement should not be null"); + throw new NullPointerException("replacement == null"); } - String ts = target.toString(); - int index = indexOf(ts, 0); - if (index == -1) + String targetString = target.toString(); + int matchStart = indexOf(targetString, 0); + if (matchStart == -1) { + // If there's nothing to replace, return the original string untouched. return this; + } + + String replacementString = replacement.toString(); + + // The empty target matches at the start and end and between each character. + int targetLength = targetString.length(); + if (targetLength == 0) { + int resultLength = (count + 2) * replacementString.length(); + StringBuilder result = new StringBuilder(resultLength); + result.append(replacementString); + for (int i = offset; i < count; ++i) { + result.append(value[i]); + result.append(replacementString); + } + return result.toString(); + } - String rs = replacement.toString(); - StringBuilder buffer = new StringBuilder(count); - int tl = target.length(); - int tail = 0; + StringBuilder result = new StringBuilder(count); + int searchStart = 0; do { - buffer.append(value, offset + tail, index - tail); - buffer.append(rs); - tail = index + tl; - } while ((index = indexOf(ts, tail)) != -1); - //append trailing chars - buffer.append(value, offset + tail, count - tail); - - return buffer.toString(); + // Copy characters before the match... + result.append(value, offset + searchStart, matchStart - searchStart); + // Insert the replacement... + result.append(replacementString); + // And skip over the match... + searchStart = matchStart + targetLength; + } while ((matchStart = indexOf(targetString, searchStart)) != -1); + // Copy any trailing chars... + result.append(value, offset + searchStart, count - searchStart); + return result.toString(); } /** |