Optimize the performance of StringUtils.replace
bug 36583, from Chris Hyzer git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/lang/trunk@279977 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7240ef6dec
commit
7c818a9f22
|
@ -226,6 +226,9 @@ limitations under the License.
|
|||
<contributor>
|
||||
<name>Oliver Heger</name>
|
||||
</contributor>
|
||||
<contributor>
|
||||
<name>Chris Hyzer</name>
|
||||
</contributor>
|
||||
<contributor>
|
||||
<name>Marc Johnson</name>
|
||||
</contributor>
|
||||
|
|
|
@ -111,6 +111,7 @@ import java.util.List;
|
|||
* @author Al Chou
|
||||
* @author Michael Davey
|
||||
* @author Reuben Sivan
|
||||
* @author Chris Hyzer
|
||||
* @since 1.0
|
||||
* @version $Id$
|
||||
*/
|
||||
|
@ -2956,19 +2957,25 @@ public class StringUtils {
|
|||
* <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();
|
||||
|
|
|
@ -804,12 +804,23 @@ public class StringUtilsTest extends TestCase {
|
|||
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() {
|
||||
|
|
Loading…
Reference in New Issue