我提供了一个家庭作业问题的代码,我正在尝试分析每个步骤的作用。该程序应该从字符串ex中删除提供的字符: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;
}
}
答案 0 :(得分:0)
.toLowerCase()表示以小写形式返回当前字符串。 See #toLowerCase
String test = "Hello World";
String testLoweredCase = test.toLowerCase(); // "hello world"
在此代码中,
int pos = copy.indexOf(remove.toLowerCase());
这意味着在'复制' string,返回包含' remove'中字符串的第一个索引。 See #indexOf
答案 1 :(得分:0)
int pos = copy.indexOf(remove.toLowerCase());
这里pos
给出了基本字符串中可移动字符串的第一个索引。
例如:
您给定的字符串:Hello World
删除字符串:llo
所以,pos将是:2
remove.toLowerCase()
使您的可移动字符串变为小写。
base.substring(pos + remove.length())
这里,base是主字符串。如果String的substring方法接受单个参数,那么它将从该位置创建一个子串到结束。 在这里,您将获取pos作为可移除字符串的第一个索引并添加可移除字符串的长度。所以,你在可移动字符串之后得到了位置。
答案 2 :(得分:0)
remove.toLowerCase()
这是一个用于区分大小写的字符串比较的技巧 - 而一些String方法确实有不区分大小写的变体(如equals
和equalsIgnoreCase
),对于没有这种方法的情况经常使用的技巧是将两个比较的字符串转换为小写(或大写)。如果您正在使用缺少区分大小写比较的外部系统(例如数据库),这也很有用。
因为你不想在结果字符串中更改大小写,但是你要跟踪两个字符串 - base
,它总是具有正确的大小写,{{1}这是它的低级变体。
因此,此方法适用于输入copy
,"Hello there"
。
"LLo"
和pos
在Java中,字符串是不可变的(不能更改),因此您必须创建一个带有结果的新String。
如何找到remove.length()
减去"Hello there"
的结果?您找到"llo"
并使用此字符串之前的所有内容以及之后的所有内容。 "llo"
是pos
子字符串在整个字符串中开始的位置,"llo"
是它结束的位置。
虽然你没有提出这个问题,但是在实现字符串操作方法时还要记住一件事 - 如果它会执行多个操作(例如&#34) ;替换/删除所有事件"),以前的操作将如何影响后者?
示例:输入pos + remove.length()
,删除"balloon"
。
实施会返回"lo"
还是"balon"
?也就是说,在删除"ban"
一次之后,它会从字符串的开头查找匹配项开始,还是从之后的位置继续它刚刚执行的替换/删除?
通常的方法往往是后者,因为它只对原始输入进行操作,而不是对部分修改后的结果进行操作。这看起来更符合用户和#39;期望。另一方面,您的方法使用前一种方法。它本身并不是错误的,但你应该知道它(并且在生产代码中也以任何方式记录它)。通过将适当的起始位置作为"lo"
的第二个参数,可以修改您的代码以使用后一种方法。