Бинарный поиск сравнить со строковыми объектами
class ObjectBinarySearcher{
public static int search(String[] array, String value){
int first = 0, last = array.length-1, position = -1;
boolean found = false;
while(!found && first < last){
int mid = (first+last)/2;
int midValue = array[mid].compareTo(value);
if(midValue==0){
position = mid;
found = true;
}
else if(midValue<0)
last = mid-1;
else
first = mid+1;
}
return position;
}
}
Я отправляю массив, содержащий {"love", "hate", "happy", "sad", "нейтральный"}, и каждый раз, когда я пытаюсь использовать мой метод двоичного поиска для поиска "нейтрального", он говорит мне это не найдено. Что является причиной этого?
2 ответа
Ваш входной массив должен быть отсортирован, чтобы использовать бинарный поиск.
Как указал @Libby, ваш цикл while должен измениться так, чтобы первый был меньше или равен последнему.
Вы должны иметь возможность выйти из цикла, если не найдено совпадений, когда
first == last
,Если midValue < 0, вам нужно переместить нижнюю границу, а не верхнюю границу (и наоборот).
Новый код:
while (!found && first <= last) { // allow first to be lower or equal to last
int mid = (first + last) / 2;
int midValue = array[mid].compareTo(value);
if (midValue == 0) { // matched!
position = mid;
found = true;
} else if (first == last) { // didn't match and there was only one left to check
break; // so break out of the loop
} else if (midValue < 0) { // current pos is too low
first = mid + 1; // so adjust the lower bound
} else { // current pos is too high
last = mid - 1; // so adjust the upper bound
}
}