1

我偶尔会从 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 if( ! this.gridRef.equals(other.gridRef))
        result=false;
    else if( ! this.recorder.equals(other.recorder))
        result=false;
    return result; 
}

一切都非常简单,但在某些对象上 .equals() 在看似 2 个相同的字符串上返回 false。

这是发生错误时表达式监视列表的屏幕截图。如您所见,尽管这两个字符串看起来相同,但 this.speciesEng.equals(other.speciesEng) 返回 false。

这些字符串最初来自同一个字符串资源,但都通过 XMPP 连接并返回。

编辑:要通过 XMPP 连接传递它们,它们已与其他字符串连接以表示整个 OutputHolder。然后在返回时使用 .substring(start,end) 将它们分开。我突然想到,如果我从子字符串中创建一个新字符串可能会有所不同,但这没有任何效果。也没有修剪它们。

我不知道如何继续调试问题。欢迎任何帮助或建议。

4

5 回答 5

2

确保没有尾随空格。因此,在使用trim方法进行比较之前,最好在字符串上使用equals方法。

于 2013-09-11T09:50:46.950 回答
2

里面可能有一些空格。String#trim在调用 equals 之前使用方法。

于 2013-09-11T09:52:07.630 回答
1

我认为您应该首先trim使用两个字符串并去掉额外的空格。
这样,您将能够Strings正确地将两者等同起来。

示例代码:

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"))
{
 .....
}


我希望这有帮助。

于 2013-09-11T09:53:13.387 回答
0

在上帝知道从调试器复制和粘贴到十六进制编辑器需要多少小时后,我发现了问题和可行的解决方案。

正如所建议的那样,问题是空格,但不是我或(我认为)其他人怀疑的方式。由于某种原因,我未能深入了解,我的字符串中出现了不间断的空格(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();

远非优雅,但它暂时有效。如果有人要添加更多内容,我会将问题留待几天。

感谢大家的回答。

于 2013-09-11T13:22:39.800 回答
0
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;

}

于 2013-09-11T09:58:45.110 回答