我对CodingBat Java练习感到困惑。如果给定的字符串包含“xyz”的外观,其中xyz不直接以句点(。)开头,则假设返回true。所以“xxyz”计算但“x.xyz”没有。
xyzThere("abcxyz") → true
xyzThere("abc.xyz") → false
xyzThere("xyz.abc") → true
我无法想象我的生活,所以我只是在线查找解决方案,我很困惑为什么这样做。有人想帮忙澄清一下吗?我在代码中添加了一些关于我遇到问题的评论。
public boolean xyzThere(String str) {
int pos =0;
while ((pos = str.indexOf("xyz")) >= 0) { `
while ((pos = str.indexOf("xyz")) >= 0) {
让我感到困惑。我尝试了这个没有双括号,它没有用。双括号是否对int或某事进行某种转换?另外,pos
如何在while语句中分配给某个东西,它是否先运行右边的部分然后分配它?
if (pos == 0)
return true;
if (str.charAt(pos-1) != '.')
return true; // found it
// xyz was preceded by a period so skip over this match
str = str.substring(pos+1);
我很困惑它甚至可以达到str = str.substring(pos+1);
我认为我可以完全取消它,但它打破了整个程序。既然它是一个if语句而且它没有括号使它成为一个块语句,它是如何或何时达到的,它背后的逻辑是什么?这句话的目的是什么,因为它对我来说似乎毫无意义。即使它在代码中达到了它,它做了什么?
}
return false; // no luck
}
答案 0 :(得分:1)
while ((pos = str.indexOf("xyz")) >= 0) {
如果找不到该字符串,则 indexOf
返回-1,因此只要在字符串中找到“xyz”,这将继续查找。稍后会看到它是如何确保这是另一个事件,而不是再次出现。
额外的支持是要强调这里还有一项任务。 pos
正在更新到找到的“xyz”的开头(如果没有,则为-1)。
if (pos == 0)
return true;
一开始就允许 - 我猜。
if (str.charAt(pos-1) != '.')
return true;
如果不是“。”就在它之前,我们已经完成了。
str = str.substring(pos+1);
抛弃一切,包括发现的“xyz”的“x”。确保下次我们再找不到同一个。
return false;
我们没有找到一个就结束了 - 它一定不在那里。
答案 1 :(得分:1)
对于任何读者,这里是xyzThere问题:http://codingbat.com/prob/p136594
由于您最初在寻找任何解决方案,因此这是一个非循环解决方案:
public boolean xyzThere(String str) {
return str.replaceAll("\\.xyz", "").contains("xyz");
}
关于双重parens:如果删除双重parens,则它将无法编译,因为编译器会将其解释为尝试将str.indexOf("xyz") >= 0
分配给pos
变量,以及类型,布尔值和int分别,不匹配。
您会注意到赋值位于java运算符优先级的底部 - 没有额外的parens,它将在最后发生:http://www.cis.upenn.edu/~palsetia/java/precedenceTable.html unle
关于循环中的赋值 - 是的,这是有效的。然后将分配给pos
的值与0进行比较。
关于str = str.substring(pos+1);
。这就是发布的解决方案从字符串中删除“.xyz”的方式,最终确定字符串是否仍然包含“xyz”。
关于if语句
if (str.charAt(pos-1) != '.')
return true; // found it
如果没有括号,则if语句的隐含范围如果是下一个语句。这里的风格通常被认为是你找到的原因后面的练习,应该重写为:
if (str.charAt(pos-1) != '.') {
return true;
}
或
if (str.charAt(pos-1) != '.') return true;
答案 2 :(得分:0)
以下代码片段需要“双括号”(实际上是双括号 - 因为括号是一个不同的字符,所以要付出精确的代价),因为parens将不同部分归为数学表达式。您认为双括号实际上是单个表达式,它将表达式的不同部分与您可能认为它们正在分组的部分进行分组。
while ((pos = str.indexOf("xyz")) >= 0)
^-----^
^------------------------^
^-------------------------------^
如果您切换到IDE而不是您可能正在使用的简单文本编辑器,IDE将突出显示匹配的括号,以便您可以看到哪个打开paren与哪个关闭paren相关。没有施法或其他魔法。括号,括号,尖括号和花括号。只是在那里显示特定事物组的开始和结束,无论是表达式,表达式中的表达式,数据集等等。