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