BinarySearch не удается найти определенные элементы в строке []


Название романа и присвоенный ему целочисленный код хранятся в отсортированном массиве таким образом, что каждый четный индекс (включая 0) содержит код, а каждый нечетный индекс содержит заголовок:

[1, Том Сойер, 2, Черная Красавица, 3, Остров Сокровищ]

В настоящее время я реализовал метод BinarySearch, который принимает введенный пользователем код и выводит соответствующий заголовок, если он существует. Это работает, если пользователь не вводит:

  • 100 (последний код в массив)
  • 2, 6 или 10; но работает для 1

    public static String binarySearch(String [] bookList, int left, int right, String code)
    {
    
    /* bookList - sorted array 
     * left - leftmost index
     * right - rightmost index
     * code - item to look for
     */
    
     int middle;
    
     if (left > right) {
         return "left>right";
     }
    
     middle = (left + right)/2;
     /*set middle to nearest even offset (all # are in  even position)*/
     middle += middle & 1;
    
     if (bookList[middle].equals(code)) {
            return bookList[middle + 1];
     }
    
     if (code.compareTo(bookList[middle]) < 0) {
        return binarySearch(bookList, left, middle - 1, code);
     }
    
     return binarySearch(bookList, middle + 2, right, code);         
    }
    

Все содержимое массива можно найти здесь

1 2

1 ответ:

Проблема в том, что ваши коды-это строки, представляющие числа. Поскольку вы сравниваете их как строки, лексикографический порядок равен 1, 10, 11, 12, ..., 19, 100, 2, 20, 21... таким образом, массив не отсортирован, как вы могли бы подумать.
То, что вы должны сделать, это разобрать код как int -

int bookCode = Integer.parseInt(code);

А затем сравнить -

if Integer.parseIntbookList[middle] < bookCode
//do something