在Java中替换字符串索引之间的一部分

46
假设我有字符串123456789。我知道我想要替换字符串的索引3-5(即4、5和6)。请注意,替换的内容可能不是3个字符,我可能最终想要的结果是123foobar789
最佳方法是什么?

@ogzd 不是的,只是个白痴。对不起,大家! - JJJollyjim
说“模棱两可”不恰当的评论是不合适的。 - Luc-Olivier
3个回答

59

尝试以下代码。借助StringBuffer你可以进行替换。StringBuffer replace java docs

public static void main(String[] args) {

        StringBuffer buf = new StringBuffer("123456789");

        int start = 3;
        int end = 6;
        buf.replace(start, end, "foobar"); 
        System.out.println(buf);

    }

}

运行以上程序后,以下内容将会输出。

123foobar789

演示


39
首先,你不能这样做1,因为在Java中,String是不可变的。
然而,你可以使用String#substring()方法创建一个新的String对象,以获得所需的值(例如):
String s = "123456789";
String newString = s.substring(0, 3) + "foobar" + s.substring(3+3);
System.out.println(newString);

如果你想高效地实现它,可以避免创建一些由连接和substring()方法使用的中间字符串。
String s = "123456789";
StringBuilder sb = new StringBuilder();
char[] buff = s.toCharArray();
sb.append(buff , 0, 3).append("foobar");
sb.append(buff,3+3,buff.length -(3+3));
System.out.println(sb.toString());

然而,如果它不在一个非常紧密的循环中完成 - 你应该忽略它,并坚持第一种更易读的解决方案。


(1) 不容易,但可以使用reflection来实现 - 但应该避免这样做。


7
建议使用 StringBuffer.replace 方法。 - Tom
这可能是实现此目标最低效的方式。 - Brian Roach
6
该问题询问如何能够完成,而不是关于如何以高效的方式完成。这是最易读的完成方式,除非在非常紧密的循环中使用它 - 否则没有必要为了更有效率而牺牲易读性。 - amit
感谢指出String是不可变的。这立即让人走上了正确的轨道。 - HopeKing
不变性是无关紧要的。例如,我期望一个replaceRange(int start, int length, String replacement)方法会返回更新后的字符串,其中范围已被替换。 - Josh M.

14

如果给定的子字符串没有重复,则尝试这样做。

String s ="123456789";
s = s.replace(s.substring(3,6), "foobar");

如果给定的子字符串重复出现,则可以尝试这种方法。

String s ="123123123";
s= s.substring(0,3) + "foobar" + s.substring(6,s.length());

2
它只解决了示例输入的问题。如果s="123123123"会发生什么? - amit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接