1

由于字符串是不可变的,我正在尝试重新创建它。我需要替换其中一个字母。

for (int i = 0; i < mat.length(); i++){
    //there's more stuff here, but that'd require a lot more explaining
    //the following don't occur at every iteration
    //mat and s are always the same length though
    if (i == s.length())
        mat = mat.substring(0, i) + s.charAt(i);
    else
        mat = mat.substring(0, i) + s.charAt(i) + mat.substring(i + 1, mat.length());
}

基本上用相同索引处的 String s 的字母来改变 String mat 的字母。问题是如果它是最后一个索引,我会得到一个越界错误,所以我选择使用 if/else 来解决这个问题。

但是这两个条件都运行代码存在冗余:

mat = mat.substring(0, i) + s.charAt(i)

消除这种冗余的最佳方法是什么?谢谢!

4

4 回答 4

1

你想要这样的东西(重构)?

String optional = ""; 
if ((i != s.length()))
    optional=  mat.substring(i + 1, mat.length());

mat = mat.substring(0, i) + s.charAt(i) + optional

;

于 2013-11-11T05:27:51.697 回答
0

如果i=s.length()不是最后一个索引将是i-1

if (i == s.length())
mat = mat.substring(0, i) + s.charAt(i-1);// Use i-1 instead of i.
else
mat = mat.substring(0, i) + s.charAt(i) + mat.substring(i + 1, mat.length());
于 2013-11-11T05:27:43.453 回答
0

如果值 i 等于字符串 s 的长度。

在您的代码中 s.charAt(i) 超出了数组范围。要使用的最大索引应该是i-1,这是最后一个字符。

于 2013-11-11T05:28:20.307 回答
0
pat = pat.substring(0, i) + s.charAt(i) + pat.substring(i + 1, pat.length());

本身就可以工作......我不太确定为什么......如果需要在字符串的第一个字母处发生更改,则第一个子句只是“”,如果它是最后一个子句也类似字母......不应该有i + 1的越界异常吗?

更新: 刚刚做了一个快速的临时程序,因为如果子字符串方法的包含索引仅超过最后一个索引的 1,则它不会返回越界。

示例

    man ="what";

    System.out.println(man.substring(4, 4));

工作得很好,什么也不输出。如果您仅使用 .print,控制台甚至不会在 Eclipse 上弹出

于 2013-11-11T05:53:57.497 回答