【问题标题】:Remove redundancy while "editing" a String在“编辑”字符串时删除冗余
【发布时间】:2013-11-22 20:16:34
【问题描述】:

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

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)

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

【问题讨论】:

  • 你在增加 i 吗?此外,如果您使用 StringBuilder 来代替,因为您创建了太多的字符串,这将是有效的。
  • if (i == s.length()) 然后你就完成了——你已经遍历了字符串的所有字符。
  • 我不认为我可以使用 StringBuilder 哈哈,它是用于学校的。还有马特,但我可能需要更改最后一个字符?
  • 如果if (i == s.length()) 评估为真,您的代码将失败。如果i 是字符串长度,那么随后的s.charAt(i) 将产生IndexOutOfBounds 错误。
  • 这个问题的标题和代码示例很不清楚。请提供所需输入和输出的示例。

标签: java string char substring redundancy


【解决方案1】:

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

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

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

;

【讨论】:

  • 哈哈我试过了,因为你最初对 mat 的重新定义有效地切断了结尾,所以不起作用。
  • 啊,是的,我试图避免使用另一个字符串,因为它是相同/更多的代码。但是你的解决方案是不同的......嗯,有趣......给我一秒钟
【解决方案2】:

如果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());

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      pat = pat.substring(0, i) + s.charAt(i) + pat.substring(i + 1, pat.length());
      

      本身就可以工作......我不太清楚为什么...... 如果更改需要发生在String的第一个字母,第一个子句只是“”,同样如果它是最后一个字母......不应该有i +的越界异常1?

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

      示例

          man ="what";
      
          System.out.println(man.substring(4, 4));
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-31
        相关资源
        最近更新 更多