Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 函数,如果字符串包含;xyz";不直接在一个周期之前?_Java_String - Fatal编程技术网

Java 函数,如果字符串包含;xyz";不直接在一个周期之前?

Java 函数,如果字符串包含;xyz";不直接在一个周期之前?,java,string,Java,String,我真的被编写Java代码的练习弄糊涂了。如果给定字符串包含一个“xyz”的外观,其中xyz前面没有直接的句点(.),则假定返回true。所以“xxyz”算数,但“x.xyz”不算数 xyzThere("abcxyz") → true xyzThere("abc.xyz") → false xyzThere("xyz.abc") → true 我一辈子都搞不懂这一点,所以我只是在网上查了一个解决方案,我很困惑为什么会这样。有人想帮忙澄清吗?我在代码中添加了一些注释,以说明我遇到的问题 publi

我真的被编写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语句,没有括号使它成为一个block语句,它是如何或何时达到的,它背后的逻辑是什么?这个语句的目的是什么,因为它对我来说似乎毫无意义。即使它确实在代码中达到了,它又有什么意义呢是吗

} 

return false; // no luck 
}
indexOf
如果未找到字符串,则返回-1,因此只要在字符串中找到“xyz”,就会继续查找。有关如何确保这是另一个事件而不是同一个事件的信息,请参阅下文

return false;
额外的括号是为了强调这里还有一个赋值。
pos
正在更新到找到的“xyz”的开头(如果没有更多,则为-1)

我想一开始是允许的

if (str.charAt(pos-1) != '.') 
  return true;
如果在它前面有一个“.”,那么我们就完成了

str = str.substring(pos+1);
扔掉所有的东西,包括发现的“xyz”的“x”。确保下次我们不会再找到相同的

return false;

我们最终没有找到一个-它一定不在那里。

下面的代码片段需要“双括号”(真正的双括号-精确地说是值得的,因为括号是不同的字符)因为帕伦斯将数学表达式的不同部分进行分组。你认为的双括号实际上是单帕伦斯将表达式的不同部分与你可能认为的分组进行分组

while ((pos = str.indexOf("xyz")) >= 0)
                         ^-----^
       ^------------------------^
      ^-------------------------------^

如果您切换到IDE,而不是您可能正在使用的简单文本编辑器,IDE将突出显示匹配的括号,以便您可以看到哪个开始括号与哪个结束括号相关。没有强制转换或其他魔术。括号、括号、尖括号和花括号。仅用于显示开始和结束对于特定的事物组,无论是表达式、表达式中的表达式、数据集等。

对于任何读者,这里是xyzThere问题:

由于您最初寻找的是任何解决方案,因此这里有一个非循环解决方案:

public boolean xyzThere(String str) {
    return str.replaceAll("\\.xyz", "").contains("xyz");
}
关于双参数:如果删除双参数,则它将不会编译,因为编译器将其解释为试图将
str.indexOf(“xyz”)>=0
赋值给
pos
变量,并且类型(分别为boolean和int)不匹配

您会注意到赋值位于java运算符优先级的底部-如果没有额外的参数,它将最后发生: 除非

关于循环中的分配-是,这是有效的。然后将分配给
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;
}


如果你将我的澄清与你的回答结合起来,我们会有更完整的答案,更彻底地回答OP的问题,然后我可以删除我的答案。
if (str.charAt(pos-1) != '.') {
  return true;
}
if (str.charAt(pos-1) != '.') return true;