Java string.equals(字符串)的行为不符合预期
我偶尔会从String.equals(String)得到奇数结果 代码如下:Java string.equals(字符串)的行为不符合预期,java,android,eclipse,string,equals,Java,Android,Eclipse,String,Equals,我偶尔会从String.equals(String)得到奇数结果 代码如下: boolean equals(OutputHolder other){ boolean result=true; if( ! this.speciesEng.equals(other.speciesEng)) result=false; else if( ! this.date.equals(other.date)) result=false; else
boolean equals(OutputHolder other){
boolean result=true;
if( ! this.speciesEng.equals(other.speciesEng))
result=false;
else if( ! this.date.equals(other.date))
result=false;
else if( ! this.gridRef.equals(other.gridRef))
result=false;
else if( ! this.recorder.equals(other.recorder))
result=false;
return result;
}
所有这些都非常简单,但在某些对象上。equals()在两个相同的字符串上返回false。
这是发生错误时表达式监视列表的屏幕截图。正如您所看到的,尽管两个字符串看起来相同,但是.speciesEng.equals(other.speciesEng)返回false
这些字符串最初来自同一个字符串资源,但它们都经过XMPP连接并返回
编辑:为了通过XMPP连接传递它们,它们已经与其他字符串连接起来,以表示整个OutputHolder。然后在返回时使用.substring(start,end)将它们分开。我突然想到,如果我从子字符串中创建了一个新字符串,可能会有所不同,但这没有任何效果。他们也没有
我不知道如何继续调试这个问题。欢迎提供任何帮助或建议。请确保后面没有空格。因此,在使用
equals
方法比较字符串之前,最好对字符串使用trim
方法。确保没有尾随空格。因此,最好先对字符串使用trim
方法,然后再使用equals
方法进行比较。其中可能有一些空白。在调用equals之前使用方法。其中可能有一些空白。在调用equals之前使用方法。我认为您应该首先修剪
两个字符串并去掉额外的空格。这样,您就可以正确地将两个
字符串等同起来。
示例代码:
String yourString = "Your String ";
//Trim the String and get rid of extra spaces before doing any comparisons.
yourString.trim();
//After trimming it, do the comparisons.
if(yourString.equalsIgnoreCase("other trimmed string"))
{
.....
}
我希望这会有所帮助。我认为您应该首先修剪
两个字符串并去掉额外的空格。
boolean equals(OutputHolder other){
boolean t1 = speciesEng.equals(other.speciesEng);
boolean t2 = date.equals(other.date);
boolean t3 = gridRef.equals(other.gridRef);
boolean t4 = recorder.equals(other.recorder);
return t1 && t2 && t3 && t4;
这样,您就可以正确地将两个字符串等同起来。
示例代码:
String yourString = "Your String ";
//Trim the String and get rid of extra spaces before doing any comparisons.
yourString.trim();
//After trimming it, do the comparisons.
if(yourString.equalsIgnoreCase("other trimmed string"))
{
.....
}
我希望这有帮助
boolean equals(OutputHolder other){
boolean t1 = speciesEng.equals(other.speciesEng);
boolean t2 = date.equals(other.date);
boolean t3 = gridRef.equals(other.gridRef);
boolean t4 = recorder.equals(other.recorder);
return t1 && t2 && t3 && t4;
}
}天知道从调试器复制和粘贴到十六进制编辑器需要多少小时后,我发现了问题并找到了有效的解决方案
正如我所说的,问题是空格,但不是我或(我认为)其他人所怀疑的那样。
由于某种原因,我未能弄清问题的症结所在,我在字符串中得到的是不间断的空格(0x00A0),而不是普通的空格(Ox0020)。这似乎或多或少是随机发生的,我还没有找到负责的代码部分
目前需要解决的问题是使用以下方法开始我的equals()方法:
speciesEng=speciesEng.replace((char)0x00a0,(char)0x0020);
other.speciesEng=other.speciesEng.replace((char)0x00a0,(char)0x0020);
speciesEng=speciesEng.trim();
other.speciesEng=other.speciesEng.trim();
虽然很不雅致,但它目前仍然有效。我将把这个问题留待几天,以防有人有更多的补充
谢谢大家的回答 在上帝知道从调试器复制和粘贴到十六进制编辑器需要多少小时之后,我找到了问题和有效的解决方案
正如我所说的,问题是空格,但不是我或(我认为)其他人所怀疑的那样。
由于某种原因,我未能弄清问题的症结所在,我在字符串中得到的是不间断的空格(0x00A0),而不是普通的空格(Ox0020)。这似乎或多或少是随机发生的,我还没有找到负责的代码部分
目前需要解决的问题是使用以下方法开始我的equals()方法:
speciesEng=speciesEng.replace((char)0x00a0,(char)0x0020);
other.speciesEng=other.speciesEng.replace((char)0x00a0,(char)0x0020);
speciesEng=speciesEng.trim();
other.speciesEng=other.speciesEng.trim();
虽然很不雅致,但它目前仍然有效。我将把这个问题留待几天,以防有人有更多的补充
谢谢大家的回答 在检查是否相等之前,请尝试删除字符串。在比较之前,您可能需要对字符串使用trim()。其他字段:date、gridRef和recorder如何?您是否尝试过深入查看值
字段?顺便说一句:你应该做一个返回false
,而不是result=false
,以避免不必要的比较。如果您希望equals()方法可用于集合,那么它应该是boolean equals(Object)
我想问题也会影响其他字段。它们的处理方式完全相同。在检查是否相等之前,请尝试删除字符串。在比较之前,您可能需要对字符串使用trim()。其他字段:date、gridRef和recorder如何?您是否尝试过深入挖掘值
字段?顺便说一句:你应该做一个返回false
,而不是result=false
,以避免不必要的比较。如果您希望equals()方法可用于集合,那么它应该是boolean equals(Object)
我想问题也会影响其他字段。他们的待遇完全一样。哎呀,当我发布答案时,你的答案不在那里。我刚刚尝试过这个,没有什么区别。如果你看屏幕截图,你会发现这两个字符串的长度是一样的。哎呀,当我发布答案时,你的答案不在那里。我刚刚尝试了这个,没有什么区别。如果你看屏幕截图,你会发现这两个字符串的长度是一样的。同意。它应该被称为空白。谢谢,我同意。它应该被称为空白。谢谢。这就是我的代码最初的样子,但我已经将它扩展到多行,这样我可以更容易地调试它。对于不必要的这一点也是一样。不,它以前失败过,所以我扩展了它,以便找到失败的地方。这就是我的代码最初的外观,但我已将其扩展到多行,以便更轻松地进行调试。对于不必要的这个也是一样。不,它以前失败过,所以我扩展了它,这样我就可以找到它失败的地方。谢谢所有的答案。我怀疑一个奇怪的问题会经常出现。我还没有找到有问题的代码,但一旦我找到了,我会在这里发布。最有可能的嫌疑是我使用BufferedWriter的文件处理。谢谢所有的答案。我怀疑一个奇怪的问题会经常出现。我还没有查到有问题的代码,但一旦查到了,我会把她发出去