如果字符串包含“xyz”而不是直接在句点之后,则返回true的函数?

时间:2013-12-06 00:32:16

标签: java string

我对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 
}

3 个答案:

答案 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相关。没有施法或其他魔法。括号,括号,尖括号和花括号。只是在那里显示特定事物组的开始和结束,无论是表达式,表达式中的表达式,数据集等等。