Метод Arrays.binarySearch() - Вопросы
Всего: 5 вопросов
1. Какое главное требование к массиву перед вызовом Arrays.binarySearch()?
Какое главное требование к массиву перед вызовом Arrays.binarySearch()?
Массив должен быть отсортирован по возрастанию (обычно через Arrays.sort()). Для неотсортированного массива результат не определён: исключение не бросается, но метод может вернуть бессмысленное значение. Если используется компаратор, массив должен быть упорядочен тем же компаратором.
2. Что возвращает Arrays.binarySearch(), если элемент не найден, и что такое точка вставки?
Что возвращает Arrays.binarySearch(), если элемент не найден, и что такое точка вставки?
Метод возвращает отрицательное число по формуле -(insertionPoint) - 1. Точка вставки (insertion point) — индекс первого элемента, который больше искомого, то есть позиция, куда элемент можно вставить с сохранением порядка. Восстановить её из результата можно как -result - 1. Смещение на единицу нужно, чтобы отличить «не найден, точка вставки 0» (результат -1) от «найден по индексу 0» (результат 0).
3. Как искать элемент только в части массива с помощью Arrays.binarySearch()?
Как искать элемент только в части массива с помощью Arrays.binarySearch()?
Нужно использовать перегрузку с параметрами fromIndex и toIndex: binarySearch(array, from, to, key). Начальный индекс включается в диапазон, конечный — нет (полуинтервал [from, to)). Отсортированным должен быть именно этот диапазон. Возвращённый индекс — позиция в исходном массиве, а не относительно начала диапазона.
4. Как Arrays.binarySearch() сравнивает элементы в массиве объектов и когда нужен Comparator?
Как Arrays.binarySearch() сравнивает элементы в массиве объектов и когда нужен Comparator?
Перегрузка binarySearch(Object[] a, Object key) использует естественный порядок — элементы должны реализовывать Comparable (как String или Integer). Если массив отсортирован не в естественном порядке (например, по убыванию), нужно использовать перегрузку binarySearch(T[] a, T key, Comparator<? super T> c) и передать тот же компаратор, которым выполнялась сортировка.
5. Какие типичные ошибки допускают при работе с Arrays.binarySearch()?
Какие типичные ошибки допускают при работе с Arrays.binarySearch()?
Основные ошибки: (1) поиск в неотсортированном массиве — метод не проверяет порядок и может вернуть неверный результат без исключения; (2) расчёт на дубликаты — при нескольких одинаковых значениях не гарантируется, какой индекс вернётся (не обязательно первый); (3) компаратор не совпадает с порядком сортировки; (4) проверка if (result == -1) вместо result < 0 — сравнение с -1 ловит только случай «точка вставки 0»; (5) поиск null или объектов без Comparable приводит к NullPointerException или ClassCastException.