使用第二个字符串的实例替换字符串1并使用第三个字符串替换而不使用replaceAll

时间:2014-04-22 00:48:24

标签: java string replace

这是我提出的,但最后一个测试用例不起作用。有什么建议吗?

public class tester
{
   public static String replaceAll(String a, String b, String c){
        for(;;){
           int i = a.indexOf(b);
            if(i==-1){
                break;
            }
            a = a.substring(0,i)+ c + a.substring(i + b.length());
        }
        return a;

       }

       public static void main(String args[]){
        System.out.println(replaceAll("hello my friend, how are you?", "h", "y"));
        System.out.println(replaceAll("CS221 is great!!","great","awesome"));
        System.out.println(replaceAll("aaaa","a","aaa"));
    }
}

1 个答案:

答案 0 :(得分:0)

假设我正确地阅读您的代码:

  1. 寻求" a" in" aaaa"。在零指数处找到它。
  2. 添加" aaa"到了#34; aaaa"屈服于" aaaaaaa"。
  3. 寻求" a"在" aaaaaaa"。在零指数处找到它。
  4. 添加" aaa"到" aaaaaaa"屈服" aaaaaaaaaa"。 ...
  5. 因此字符串将无限增长。你可以考虑按插入文本的长度更新搜索索引,以确保你不会像这样爆炸你的字符串。

    另外,如果您要进行大量字符串连接,我建议使用StringBuilder来防止大量复制。

    这就是说这样的事情应该有效:

    public static String replaceAll(String a, String b, String c){
        StringBuilder sb = new StringBuilder();
    
        int i = 0;
        while(i < a.length()){
            int j = a.indexOf(b, i);
            if(j == -1){
                sb.append(a.substring(i, a.length()));
                i = a.length();
            } else {
                sb.append(a.substring(i, j));
                sb.append(c);
                i = j + b.length();
            }
        }
        return sb.toString();
    }
    

    编辑 - 添加了解决方案。