如何在Java中从字符串中删除给定的字符串或字符?

如何在Java中从字符串中删除给定的字符串或字符?,java,string,Java,String,我得到了一个家庭作业问题的代码,我试图分析每个步骤的作用。这个程序应该从字符串中删除提供的字符,例如:withoutString(“Hello there”,“llo”)返回“He there” 我对pos和remove.length()和remove.toLowerCase()在这段代码中的作用感到困惑。有人能帮我解释一下吗?我是Java的初学者,我想了解一些事情,而不是简单地得到答案。多谢各位 public class WithoutString { public String w

我得到了一个家庭作业问题的代码,我试图分析每个步骤的作用。这个程序应该从字符串中删除提供的字符,例如:
withoutString(“Hello there”,“llo”)
返回
“He there”

我对
pos
remove.length()
remove.toLowerCase()
在这段代码中的作用感到困惑。有人能帮我解释一下吗?我是Java的初学者,我想了解一些事情,而不是简单地得到答案。多谢各位

public class WithoutString {

    public String withoutString(String base, String remove) {
        String copy = base.toLowerCase(); 
        int pos = copy.indexOf(remove.toLowerCase());
        while ( pos >= 0) {
            base = base.substring(0, pos) + base.substring(pos + remove.length());
            copy = base.toLowerCase();
            pos = copy.indexOf(remove.toLowerCase());
        }
        return base;
    }
}
.toLowerCase()表示返回所有小写的当前字符串

在这部法典中

int pos = copy.indexOf(remove.toLowerCase());
这意味着在“复制”字符串中,返回包含“删除”字符串的第一个索引

.toLowerCase()表示返回所有小写的当前字符串

在这部法典中

int pos = copy.indexOf(remove.toLowerCase());
这意味着在“复制”字符串中,返回包含“删除”字符串的第一个索引

此处
pos
给出了基本字符串中可移动字符串的第一个索引

例如:

您给定的字符串:Hello World

删除字符串:llo

因此,pos将是:2

remove.toLowerCase()
将您的可移动字符串改为小写

base.substring(pos + remove.length())
这里,base是主字符串。若String的substring方法采用单个参数,那个么它将从该位置到末尾创建一个子字符串。 这里,您将获取pos,它是可移动字符串的第一个索引,并添加可移动字符串的长度。因此,您将获得可移动字符串之后的位置

此处
pos
给出了基本字符串中可移动字符串的第一个索引

例如:

您给定的字符串:Hello World

删除字符串:llo

因此,pos将是:2

remove.toLowerCase()
将您的可移动字符串改为小写

base.substring(pos + remove.length())
这里,base是主字符串。若String的substring方法采用单个参数,那个么它将从该位置到末尾创建一个子字符串。 这里,您将获取pos,它是可移动字符串的第一个索引,并添加可移动字符串的长度。因此,您将获得可移动字符串后面的位置。

remove.toLowerCase()
这是一个用于进行区分大小写的字符串比较的技巧-虽然某些字符串方法确实有不区分大小写的变体(如
equals
equalsIgnoreCase
),但对于没有这种方法的情况,经常使用的技巧是将两个比较的字符串转换为小写(或大写)。如果您使用的外部系统(例如数据库)在需要时缺少区分大小写的比较,这也很有用

因为您不想更改结果字符串中的大小写,所以要跟踪两个字符串-
base
,它总是有正确的大小写,以及
copy
,这是它的小写变体

因此,该方法同样适用于输入
“你好”
“LLo”

pos
remove.length()
在Java中,字符串是不可变的(不能更改),因此您必须使用结果创建一个新字符串

您如何找到
“你好”
减去
“llo”
的结果?您可以找到
“llo”
,并使用该字符串前面的所有内容以及后面的所有内容
pos
是整个字符串中
“llo”
子字符串的起始位置,
pos+remove.length()
是子字符串的结束位置

旁注 虽然您没有询问,但在实现字符串操作方法时,还有一件事值得记住——如果它将执行多个操作(如“替换/删除所有引用”),那么前面的操作将如何影响后面的操作

示例:输入
“balloon”
,删除
“lo”

实现是否返回
“balon”
“ban”
?也就是说,在删除
“lo”
一次之后,它是从字符串的开头重新开始寻找匹配项,还是从刚刚执行的替换/删除之后的位置继续

通常的方法倾向于后者,因为它只对原始输入进行操作,而不是对部分修改的结果进行操作。这似乎更符合用户的期望。另一方面,您的方法使用前一种方法。这本身并没有错,但您应该意识到这一点(并且在生产代码中也以任何方式记录它)。通过将适当的起始位置作为第二个参数提供给
copy.indexOf()

remove.toLowerCase()
这是一个用于进行区分大小写的字符串比较的技巧-虽然某些字符串方法确实有不区分大小写的变体(如
equals
equalsIgnoreCase
),但对于没有这种方法的情况,经常使用的技巧是将两个比较的字符串转换为小写(或大写)。如果您使用的外部系统(例如数据库)在需要时缺少区分大小写的比较,这也很有用

因为您不想更改结果字符串中的大小写,所以要跟踪两个字符串-
base
,它总是有正确的大小写,以及
copy
,这是它的小写变体

因此,该方法同样适用于输入
“你好”
“LLo”

pos
remove.length()
在Java中,字符串是不可变的(不能更改),因此您必须使用结果创建一个新字符串

您如何找到
“你好”
减去
“llo”
的结果?您可以找到
“llo”
,并使用该字符串前面的所有内容以及后面的所有内容
pos
“llo”
子字符串的起始位置