我是java的新手,但我想我在这几周里做得很好。但现在我陷入了这个循环。
这是我班上的一个方法。为了帮助我调试,我添加了#34; myString"字符串和"语法"列出这个方法,以展示正在发生的事情,并保持简单,至少现在。
public void getIndex(){
String myString = "2 2 + 3 5";
String[] syntax = myString.split(" ");
for (int index = 0; index < syntax.length; index++){
System.out.println("current index is: " + index);
System.out.println("It has: " + syntax[index]);
// these print statements are made to help me debug
if (syntax[index] == "+"){
indexNeeded = index;
break;
}
}
System.out.println("Index Needed: " + indexNeeded);
正如你在循环中看到的那样,我想打破&#34; for循环&#34;当列表的元素,&#34;语法&#34;是&#34; +&#34;。 (我正在显示&#34; +&#34;这里可以是实际程序中的任何内容。)
这是输出,当运行此方法时:
current index is: 0
It has: 2
current index is: 1
It has: 2
current index is: 2
It has: +
current index is: 3
It has: 3
current index is: 4
It has: 5
Index Needed: 0
当循环找到&#34; +&#34;但似乎&#34;如果陈述&#34;根本不工作,因此&#34; indexNeeded&#34;没有改变。
这是一个简单的方法,但我在这里做错了什么?
答案 0 :(得分:10)
您正在尝试将字符串与==
进行比较。这不起作用,您需要使用.equals()
:
变化:
syntax[index] == "+"
到
syntax[index].equals("+")
==
仅在两个对象引用同一实例时才返回true。当字符串的内容相同时,equals()
将返回true。这就是你想要的。
答案 1 :(得分:3)
替换
if (syntax[index] == "+"){
带
if (syntax[index].equals("+")){
当您尝试==
时,它会比较引用,而syntex[index]
并不是指文字"+"
所在的同一位置。所以他们不平等。
// If syntax[index] get '+' value from somewhere but not literal
if(syntax[index] == "+" ) // is false
// right way is
if(syntax[index].equals("+")) // is true
// If syntax[index] get '+' value from literal
syntax[index] = "+";
if(syntax[index] == "+" ) // is true
// This approach is faster but has mentioned above has limitations.
当你做等于它时,它实际上比较了内容。
答案 2 :(得分:2)
你应该写:
syntax[index].equals("+")
"+"
是对String的引用,syntax[index]
是另一个。但是在这里你要比较对象本身,而不是它们的参考。
如果你选择任何类的a
和b
两个对象,a == b
将测试引用是否相同。测试它们是“相同”的是a.equals(b)
。
你应该仔细阅读Java的.equals() documentation,这是理解的基础部分。
答案 3 :(得分:1)
对于String,你需要做
syntax[index].equals("+")
答案 4 :(得分:1)
如果要比较String的值,则需要使用 .equals(),但如果要比较引用,请使用运算符 == 。这是新手的常见错误。
花一点时间看看之间的区别:
syntax[index] == "+"
和
"+".equals(syntax[index])
它命令你不允许在语法[index]
中使用可能的空指针答案 5 :(得分:0)
这是一种有趣,有教育意义的方法来解决您的问题。向您的方法添加对String.intern()
的调用,它将正常工作。惊喜你的朋友! :)
public int getIndex()
{
String myString = "2 2 + 3 5";
String[] syntax = myString.split(" ");
int indexNeeded = -1;
for (int index = 0; index < syntax.length; index++)
{
System.out.println("current index is: " + index);
System.out.println("It has: " + syntax[index]);
// these print statements are made to help me debug
if (syntax[index].intern() == "+")
{
indexNeeded = index;
break;
}
}
return indexNeeded;
}
请注意,从方法返回值比使用具有类范围的变量更好。应该为可以视为对象属性的数据保留类范围的变量。 indexNeeded
不符合该说明,并且int
的名称很差 - 听起来应该是boolean
。
答案 6 :(得分:-1)
Java中的平等检查有两种形式。
等于运算符“==”检查两个变量是否引用同一个对象。在您的情况下,此测试失败,因为尽管它们的内容相同,但您指的是两个不同的字符串对象。
.equals()
方法可用于每个Java对象,并提供可扩展的相等性检查。对于字符串,请考虑以下内容:
"+".equals("+") // evaluates to true
回到相等运算符:
"+" == "+" // evaluates to false
有关详细信息,请参阅this page。
答案 7 :(得分:-2)
使用return;而不是休息; 它对我有用