【问题标题】:How do you replace arbitrary characters with a string in Java?如何用 Java 中的字符串替换任意字符?
【发布时间】:2017-07-04 19:05:06
【问题描述】:

到目前为止,我正在尝试创建一种将字符串中的单个字符替换为另一个字符串的方法,这些是我的参数。

public static String replaceAt(String str, int position, String replacement)

正常运行时应该是这样的:

method         input                          output

replaceAt     "Hello, World", 5, " comma"     Hello comma World

这是我目前所拥有的。

{
   String result = "";

  char character = str.charAt(position);

  str = str.replace(character, replacement);

  result = str;

  return result;
 }

但我很确定我以某种方式弄乱了语法,关于如何继续的任何指示?

【问题讨论】:

    标签: java string methods syntax charat


    【解决方案1】:

    如果你可以使用StringBuilder,那么你可以用你的输入str实例化一个,然后调用StringBuilder#replace(int, int, String)就像

    public static String replaceAt(String str, int position, String replacement) {
        return new StringBuilder(str).replace(position, position + 1, 
                replacement).toString();
    }
    

    如果你不能使用它,那么你可以使用String#substring(int, int) 并像这样连接你的输出

    return str.substring(0, position) + replacement + str.substring(position + 1);
    

    注意,内部使用StringBuilder 执行连接(至少在最近的Java 版本中),所以它相当于

    return new StringBuilder(str.substring(0, position)).append(replacement)
            .append(str.substring(position + 1)).toString();
    

    (在非常旧的版本中使用StringBuffer)。

    【讨论】:

    • 谢谢,它适用于我使用参数“Hello, World”、5、“逗号”和“Mary”、3、“ie”运行的前两个测试。但是当我尝试 "Mary", 4, "ie" 时,我得到的是 Maryie 而不是 Marie。
    • 您提到的第二个代码返回了 java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1931) at Strings.replaceAt(Strings .java:15) 使用“Mary”、4、“ie”运行时出错
    • @Rod112 "Mary" 在位置 4 没有可以替换的字符。目前尚不清楚为什么您会期望这会起作用。如果您的要求是 4 应该被视为与 3 相同,那么您必须将其设为特殊情况。
    • @ajb 你说得对,我仔细看了看,认为这可能是我的错误,但我用来运行多个测试的软件可能有问题。
    • 我不确定如何考虑特殊情况,这不是我们刚刚介绍的内容。
    【解决方案2】:

    使用replace 或其他搜索正则表达式的解决方案的最大问题是我们不知道该位置的字符是否是字符串中的唯一字符。假设输入字符串是"Hello, world, good morning"。然后您的replaceAt 将返回"Hello comma world comma good morning"。也许这就是您真正想要的(尚不清楚),但是一种假装是用字符串“替换”给定“位置”的字符的方法,不应该做更多的事情。 (如果这真的是你想要的,我建议更改名称和参数。)

    假设您要替换该位置的字符,并且该位置的字符,我建议您改用substring

    public static String replaceAt(String str, int position, String replacement) {
        return str.substring(0, position) + replacement + str.substring(position + 1);
    }
    

    编辑:如果要处理position ==字符串长度的情况,使该位置没有字符:

    public static String replaceAt(String str, int position, String replacement) {
        return str.substring(0, position) + replacement + (position == str.length() ? "" : str.substring(position + 1));
    }
    

    (如果position > 字符串长度,第一个substring 将不起作用。根据用例,如果这种情况不应该发生,你可以让它抛出异常。或者你可以做这个:)

    public static String replaceAt(String str, int position, String replacement) {
        return str.substring(0, Math.min(position, str.length())) + replacement + (position >= str.length() ? "" : str.substring(position + 1));
    }
    

    【讨论】:

    • 谢谢,这在我运行的前两个测试中运行良好。但是我遇到了 java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1931) at Strings.replaceAt(Strings.java:15) at StringsCodeCheck.main( StringsCodeCheck.java:52) 当我尝试使用“Mary”、4、“ie”作为输入运行它时出错
    • 请看我之前的评论。该方法的目的是替换位置 4 处的字符。但是位置 4 处没有字符,那么您为什么希望它起作用呢?
    • if 语句是否有效,如果位置的字符为空则返回字符串原样?
    • 是的,但是三元运算符也可以。查看我的编辑。
    猜你喜欢
    • 2016-12-24
    • 2013-09-08
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多