【问题标题】:How to delete a substring between specific characters in Java?如何删除Java中特定字符之间的子字符串?
【发布时间】:2018-11-07 00:36:40
【问题描述】:

首先,如果代码看起来很乱,很抱歉。 我必须在 Java 上创建一个待办事项列表,用户可以在其中添加和删除家务,而无需使用正则表达式。我只能使用 String 类中的方法。 输入的每个杂务都应以“\n”结尾:

list = list + addedChore + "\n"

如果用户想删除第一个家务,例如:

endofChore1 = list.indexOf("\n", 0);
chore1 = list.substring(0, endofChore1);
chore1 = ""; 

我试图做的是获取第一个 \n 的索引并使其成为从索引 0 开始到第一个 \n 的索引的子字符串,最后用空字符串替换该子字符串,这样它就删除了清单上的家务。但是,它不起作用。我能做些什么来解决这个问题?谢谢。

编辑: 这是我写的删除任何给定的家务。我看不出有什么问题。

int choreToDelete;   // number associated with chore user wants to delete
int begin = 0;
int i = 0;
int end;
String stringToDelete;


  if (choreToDelete >= 1 && choreToDelete <= numberOfChores){
   while (i < choreToDelete - 1) {
     end = list.indexOf("\n", begin);
     begin = end;
     i = i + 1;
   }
  }
stringToDelete = list.indexOf("\n", begin);
list = list.substring(stringToDelete);

【问题讨论】:

  • 其余代码在哪里?另外,请注意您提取 列表的一部分,使列表与之前完全一样。然后您将提取该部分的变量分配给一个新值,因此您现在 a) 未触及 list 并且 b) 将 chore1 = list.... 指令设为 noop。
  • @babyprog 字符串是不可变的

标签: java string substring


【解决方案1】:

字符串是不可变的。

替换

chore1 = list.substring(0, endofChore1);
chore1 = ""; 

list = list.substring(endofChore1);

这是您的完整代码:-

public static void main(String[] args) {
    String list = "choreA\nchoreB\n";
    int endofChore1 = list.indexOf("\n", 0);
    list = list.substring(endofChore1);
    System.out.println(list);
}

PS - 不试图提出最好的逻辑,只是解决 OP 在他们的代码中遇到的当前问题。

编辑

由于您已经展示了创建通用删除方法的努力,这里是完整的代码。它处理诸如 choreToDelete 小于 1 和大于 chore 数量等情况。

public static void main(String[] args) {
    String list = "choreA\nchoreB\nchoreC\n";
    list = deleteChore(list, 2);
    System.out.println(list);
}

private static String deleteChore(String list, int choreToDelete) {
    if (choreToDelete < 1 || choreToDelete > list.split("\n").length) return list;
    if (choreToDelete == 1) return list.substring(list.indexOf("\n") + 1);
    if (!list.endsWith("\n")) list = list + "\n";
    int startIndexOfChoreToDelete = nthIndexOf(list, "\n", choreToDelete - 1);
    int endIndexOfChoreToDelete = nthIndexOf(list, "\n", choreToDelete);
    return list.substring(0, startIndexOfChoreToDelete) + list.substring(endIndexOfChoreToDelete);
}

private static int nthIndexOf(String str, String substr, int n) {
    int pos = str.indexOf(substr);
    while (--n > 0 && pos != -1)
        pos = str.indexOf(substr, pos + 1);
    return pos;
}

【讨论】:

  • 如果chore1substringsubstring 会发生什么,例如String list = "choreA\nchoreB\nchoreAB\n";
  • @ScaryWombat 我进行了更改,它将适用于第一个家务,因此它仍然不是可以删除任何家务的通用方法,但会执行 OP 正在尝试执行的当前任务。如果没有其他人,我会写一个通用的。
  • @Kartik 即使是一个提示也会非常感激,我从昨天开始就一直在尝试写一个通用的但无济于事。非常感谢。
  • @babyprog 说你的字符串是choreA\nchoreB\nchoreC。现在你想删除第二个家务。您可以循环查找第一个和第二个\n 的索引。然后将第一个\n 之前的子字符串与第二个\n 之后的子字符串连接起来。如果您遇到困难,请告诉我。
  • @babyprog 既然您已经尝试过了,我已经为答案添加了完整的解决方案。确保您理解它,而不仅仅是复制它。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2018-05-15
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多