Java - 移除字符串中间部分

3
我希望以下输入能得到以下输出:
input: adele
output: ae

代码:

public class delDel {
    public static String delDel(String str) {
        StringBuilder sb = new StringBuilder();
        if(str.length() < 3){
           return str;
        }
        else if(str.substring(1, 3).equals("del")){
            StringBuilder afterRemove = sb.delete(1, 3);
            return afterRemove.toString();
        }
        else{
           return str;
        }

   }

   public static void main(String[] args) {
      Scanner input = new Scanner(System.in);

      String yourStr = input.nextLine();

      System.out.println(delDel(yourStr));
   }
}

但我一直收到相同的输入。

1
尝试使用System.out.println进行调试,特别是在else if内部...你到达了吗...sb里面有什么东西?如果学习一些简单的调试技巧,你将节省很多时间。 - Petter Friberg
1个回答

6
这里存在多个问题:
  • 您的 StringBuilder 没有使用输入字符串进行初始化。应该是 StringBuilder sb = new StringBuilder(str);。现在它总是为空。
  • substringdelete 方法使用的是最后一个索引的前一位,而不是包括最后一个索引。所以如果想要从索引1开始长度为3的子字符串,需要调用 str.substring(1, 4)
更正后的代码如下:
public static String delDel(String str) {
    StringBuilder sb = new StringBuilder(str);
    if(str.length() < 3){
       return str;
    }
    else if(str.substring(1, 4).equals("del")){
        StringBuilder afterRemove = sb.delete(1, 4);
        return afterRemove.toString();
    }
    else{
       return str;
    }
}

顺便提一下:因为你只在一个情况下使用了 StringBuilder,所以你可以将其声明放在 else if 内部(这样,在字符串少于 3 个字符时,就不会创建无用的对象)。


如果你给了他代码,为什么不试着改进它呢?1 在 StringBuilder 之前检查长度,2 为什么要创建 afterRemove,等等。删除所有 else if else 因为它具有返回值... 当你在做这些时,顺便教他一些好的编程风格。 - Petter Friberg
2
@PetterFriberg 我同意第一点(在你指出之前我犹豫是否要添加它),但我认为第二点不适用:对于初学者,我觉得阅读像这样的代码比长串调用更容易,例如 new StringBuilder(str).delete(1, 4).toString(); - Tunaki
不仅适用于初学者。我经常创建“不必要”的临时变量,只是为了一目了然地表明代码的预期功能。 - azurefrog

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