You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2005/09/10 11:29:55 UTC
svn commit: r279977 - in /jakarta/commons/proper/lang/trunk: project.xml
src/java/org/apache/commons/lang/StringUtils.java
src/test/org/apache/commons/lang/StringUtilsTest.java
Author: scolebourne
Date: Sat Sep 10 02:29:48 2005
New Revision: 279977
URL: http://svn.apache.org/viewcvs?rev=279977&view=rev
Log:
Optimize the performance of StringUtils.replace
bug 36583, from Chris Hyzer
Modified:
jakarta/commons/proper/lang/trunk/project.xml
jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java
jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java
Modified: jakarta/commons/proper/lang/trunk/project.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/lang/trunk/project.xml?rev=279977&r1=279976&r2=279977&view=diff
==============================================================================
--- jakarta/commons/proper/lang/trunk/project.xml (original)
+++ jakarta/commons/proper/lang/trunk/project.xml Sat Sep 10 02:29:48 2005
@@ -227,6 +227,9 @@
<name>Oliver Heger</name>
</contributor>
<contributor>
+ <name>Chris Hyzer</name>
+ </contributor>
+ <contributor>
<name>Marc Johnson</name>
</contributor>
<contributor>
Modified: jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java?rev=279977&r1=279976&r2=279977&view=diff
==============================================================================
--- jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java (original)
+++ jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java Sat Sep 10 02:29:48 2005
@@ -111,6 +111,7 @@
* @author Al Chou
* @author Michael Davey
* @author Reuben Sivan
+ * @author Chris Hyzer
* @since 1.0
* @version $Id$
*/
@@ -2956,19 +2957,25 @@
* <code>null</code> if null String input
*/
public static String replace(String text, String repl, String with, int max) {
- if (text == null || isEmpty(repl) || with == null || max == 0) {
+ if (isEmpty(text) || isEmpty(repl) || with == null || max == 0) {
return text;
}
-
- StringBuffer buf = new StringBuffer(text.length());
- int start = 0, end = 0;
- while ((end = text.indexOf(repl, start)) != -1) {
+ int start = 0;
+ int end = text.indexOf(repl, start);
+ if (end == -1) {
+ return text;
+ }
+ int increase = with.length() - repl.length();
+ increase = (increase < 0 ? 0 : increase);
+ increase *= (max < 0 ? 16 : (max > 64 ? 64 : max));
+ StringBuffer buf = new StringBuffer(text.length() + increase);
+ while (end != -1) {
buf.append(text.substring(start, end)).append(with);
start = end + repl.length();
-
if (--max == 0) {
break;
}
+ end = text.indexOf(repl, start);
}
buf.append(text.substring(start));
return buf.toString();
Modified: jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java?rev=279977&r1=279976&r2=279977&view=diff
==============================================================================
--- jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java (original)
+++ jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsTest.java Sat Sep 10 02:29:48 2005
@@ -804,12 +804,23 @@
assertEquals(null, StringUtils.replace(null, "any", null, 2));
assertEquals(null, StringUtils.replace(null, "any", "any", 2));
+ assertEquals("", StringUtils.replace("", null, null, 2));
+ assertEquals("", StringUtils.replace("", null, "any", 2));
+ assertEquals("", StringUtils.replace("", "any", null, 2));
+ assertEquals("", StringUtils.replace("", "any", "any", 2));
+
+ String str = new String(new char[] {'o', 'o', 'f', 'o', 'o'});
+ assertSame(str, StringUtils.replace(str, "x", "", -1));
+
assertEquals("f", StringUtils.replace("oofoo", "o", "", -1));
assertEquals("oofoo", StringUtils.replace("oofoo", "o", "", 0));
assertEquals("ofoo", StringUtils.replace("oofoo", "o", "", 1));
assertEquals("foo", StringUtils.replace("oofoo", "o", "", 2));
assertEquals("fo", StringUtils.replace("oofoo", "o", "", 3));
assertEquals("f", StringUtils.replace("oofoo", "o", "", 4));
+
+ assertEquals("f", StringUtils.replace("oofoo", "o", "", -5));
+ assertEquals("f", StringUtils.replace("oofoo", "o", "", 1000));
}
public void testReplaceOnce_StringStringString() {
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org