Я отлаживаю ошибочные результаты поиска из моего проекта класса структур данных. Этот текущий проект потребовал от нас создать упорядоченный развернутый связанный список и выполнить поиск по содержимому, а затем вернуть подсписок элементов из включающей начальной точки в эксклюзивную конечную точку. Чтобы сделать это, я должен искать во внутреннем массиве, чтобы найти точку индекса начального элемента. Я делаю это с помощью бинарного поиска, но так как он возвращает только первое найденное совпадение, и перед ним могут быть другие совпадения, мне нужно вернуться в массив, чтобы найти первое истинное совпадение. Я делаю это через
//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--;
}
Профессор предоставил тестовый код, который разбивает строку и добавляет каждый символ как элемент в структуре. Он также включил вложенный класс StringCmp, на который ссылается как comp
в объявлении бинарного поиска выше. Его метод сравнения -
public int compare(String s1, String s2) {
cmpCnt++;
return s1.compareTo(s2);
}
Однако при запуске теста метода sublist от 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, что, очевидно, неверно.
Редактировать два
Вторая часть проекта требует, чтобы мы проанализировали текстовый файл, построили объекты Song из полей Artist, Title и Lyrics, а затем запустили поиск по заголовкам, используя префикс. Ошибка, возникающая здесь, не возникает при поиске по одной или нескольким буквам, поэтому я думаю, что проблема заключается во вложенном классе StringCmp в тесте.