1

我在双向链表中使用 compareTo() 来比较代码和读取的字符串,但不知道为什么它不起作用。这涉及很多代码,但我不想让你们通读一遍,所以我会尝试发布相关的内容并希望它足够了。

这是代码行。我知道它不完整,但其他一切正常。

if(p.getCode().compareTo(str)==0){

他们是平等的。我在进行比较之前将它们打印出来,它们是相同的。

我知道得到的不多,我有点希望你相信我,他们真的是平等的,但这是为了节省你的时间。我想知道关于 compareTo() 是否有一些我应该知道的特殊规则我错过了......

谢谢。

4

4 回答 4

3

compareToComparable接口提供。没有语言强制要求Comparable.compareTo返回0Object.equals返回true。也就是说,一个对象的两个实例可能完全相同,并且 的实现Comparator.compareTo不必返回0

假设p.getCode返回 aString并且参数str是 a String,那么 的实现String确实确保equalscompareTo是一致的。

所以还有其他可能:

  1. 您在一个或两个参数中有前导或尾随空格。如果您要沿着添加调试日志的路线前进,我经常发现在每个字符串周围使用竖线 ('|') 字符会很有帮助,这样可以看到空格。
  2. 大写和小写字符存在差异。字符串比较区分大小写,Comparator必须使用特殊的不区分大小写。
于 2012-10-16T21:50:36.747 回答
1

为了测试相等性,最好使用equals()而不是compareTo(). 字符串可能存在差异,可能是尾随空格或某些不匹配的大写/小写字符。要格外小心,也许这些方面的东西会有所帮助(假设两个字符串都不为空):

if (p.getCode().trim().equalsIgnoreCase(str.trim())) {

现在, if p.getCode()is not aStringstris not a String(如果编译器抱怨该trim()对象不存在该方法,您会知道这一点)......在那里,您发现了问题 - 您必须确保两个对象都属于测试相等性之前的相同类型。

于 2012-10-16T21:44:08.893 回答
0

他们都使用相同的编码吗?在尝试比较 ASCII 和 Unicode 字符串之前,我遇到了一些问题,尤其是在解析文本文件时。

于 2012-10-16T21:48:11.933 回答
0

根据文档 String.compareTo()String.equals()在平等方面是一致的

如果字符串相等,则结果为零;当 equals(Object) 方法返回 true 时,compareTo 返回 0。

如果您想查看差异,请在两个字符串上使用toCharArray()并将每个字符打印为整数。

于 2012-10-16T21:53:10.533 回答