为什么compareTo应该为false时返回true?

Jas*_*son 1 java string-comparison data-structures

我正在从我的数据结构类项目中调试错误的搜索返回.当前项目要求我们构建有序的展开链表,并对内容进行搜索,然后将项目子列表从包含起点返回到独占终点.为了做到这一点,我必须搜索内部数组以找到start元素的索引点.我通过二分搜索来做到这一点,但由于这只返回第一个找到的匹配,并且在它之前可能还有其他匹配,我必须在数组中返回才能找到第一个真正的匹配.我通过这样做

//get first index match, work backwards
int index= binarySearch(node.items, 0, node.numUsed, item, comp);
while (index>0 && comp.compare(node.items[index], item)==0){
    index--;
}
Run Code Online (Sandbox Code Playgroud)

教授提供了测试代码,用于分解字符串并将每个字符添加为结构中的项目.他还包括一个嵌套的StringCmp类,它comp在上面的二进制搜索声明中被引用.他的比较方法是

public int compare(String s1, String s2) {
  cmpCnt++;
  return s1.compareTo(s2);
}
Run Code Online (Sandbox Code Playgroud)

但是,当在子列表方法上从i运行测试到o时,此方法返回一个真值comp.compare(h,i)==0,这是从我写的搜索类中抛出我的开始结果.我最初return index++通过结构测试得到了补偿,但是把预期的起点丢了一个.

那么为什么当它显然是假的时候才会真实地回归呢?

编辑添加了子列表方法的打印输出,预计从i运行到o

输入测试字符串= abcdefghijklmnopqrstuvwxyzaeiou 从子列表方法返回:
块1(使用4的10):[h] [i] [i] [j]
块2(使用4的10):[k] [l] [m] [n ]

h根本不应该在列表中,但是comp.compare(node.items[index], item)==0返回true,即i == h,这显然是假的.

编辑二 项目的第二部分要求我们解析文本文件,从Artist,Title和Lyrics字段构建Song对象,然后使用前缀对标题进行搜索.这里发生的错误不会发生在单字母和多字母搜索中,所以我认为问题在于测试中的StringCmp嵌套类.

Jon*_*han 5

你知道吗? compare()应该归还什么吗?通常,如果第一个参数小于第二个参数,则返回负值,如果它们相等则返回0,如果第一个参数大于第二个参数,则返回正值.

此外,什么在您的阵列上执行排序?您可以发布您的binarySearch()代码,以便我们可以看到问题是否在那里?