#java #binary-search
#java #двоичный поиск
Вопрос:
Итак, я пишу код для своего класса CS, и это требует, чтобы я использовал бинарный поиск.
Однако всякий раз, когда я запускаю код, я получаю сообщение об ошибке, указывающее это
В нем говорится, что есть проблема с моим бинарным поиском, но я не могу понять, почему.
Если вам нужно, я могу опубликовать другие 2 класса, которые я создал, но я действительно зациклен на том, почему это не проходит.
Я чувствую, что это глупая ошибка с моей артикуляцией или вызовом поиска. заранее спасибо, друзья.
РЕДАКТИРОВАТЬ: Вот требования к коду, если это поможет вам лучше.
Измените программу Movies, чтобы она сортировала DVD-диски по режиссерам. Для создания эффективного кода не применяйте сортировку для сохранения отсортированных DVD-дисков. Вместо этого измените метод add, чтобы он вставлял DVD в отсортированную коллекцию и создавал отсортированную коллекцию. Кроме того, внедрите эффективный метод поиска данного DVD режиссером. Метод должен называться searchForDVD. У него должен быть только формальный параметр строкового типа, который предоставляет director, который мы ищем. Возвращаемый тип должен быть целым числом, указывающим индекс в массиве, где находится DVD. Когда поиск не увенчался успехом, метод возвращает значение -1. Метод searchForDVD должен находиться в классе коллекции DVD. Измените метод main таким образом, чтобы в конце он также тестировал метод searchForDVD, выполнив один успешный и один неудачный поиск. Отобразите DVD, найденный при успешном поиске, и напишите соответствующий комментарий в противном случае.
Схема запуска ПРОГРАММЫ:
Отобразить все DVD-диски
Добавьте еще два DVD
Отобразить все DVD-диски после добавления этих двух DVD
Найдите конкретный DVD, который есть в коллекции, и отобразите его
Поиск определенного DVD, которого нет в коллекции
Вот код целиком для этого одного класса.
import java.util.*;
public class DVDCollection
{
private DVD[] collection;
private double totalCost;
public DVDCollection()
{
collection = new DVD[100];
totalCost = 0.0;
}
public void addDVD(String title, String director, int year, double cost, boolean bluray)
{
DVD newDvd = new DVD(title, director, year, cost, bluray);
int index = Collections.binarySearch(collection, newDvd);
if(index >= 0) {
System.out.println("DVD with title " newDvd.getTitle() " already exists.");
}
else {
int index1 = -index - 1;
collection = insertDVD(collection, newDVD, index1);
System.out.println("DVD with title " newDvd.getTitle() " added.");
}
totalCost = cost;
}
private DVD[] insertDVD(DVD[] original, DVD newDVD, int in)
{
int length = original.length;
DVD[] destination = new DVD[length 1];
System.arraycopy(original, 0, destination, 0, in);
destination[in] = newDVD;
System.arraycopy(original, in, destination, in 1, length-in);
return destination;
}
public String toString()
{
NumberFormat fmt = NumberFormat.getCurrencyInstance();
String report = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n";
report = "My DVD Collectionnn";
report = "Number of DVDs: " count "n";
report ="Total cost: " fmt.format(totalCost) "n";
report = "Average cost: " fmt.format(totalCost/count);
report = "nnDVD List: nn";
for (int dvd = 0; dvd < count; dvd )
report = collection[dvd].toString() "n";
return report;
}
}
Комментарии:
1. Включите сообщение об ошибке в свой вопрос .
2. Вы написали класс
Collections
со статическим методомbinarySearch
?
Ответ №1:
API для бинарного поиска является
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key)
Список должен быть составлен из элементов сопоставимого интерфейса. Реализует ли объект DVD «Сопоставимый» интерфейс?
Ответ №2:
Это говорит вам, в чем проблема: в коллекции нет метода, который принимает эти два параметра.
Первый должен быть списком некоторого класса или интерфейса, а второй должен реализовывать Comparable. Похоже, что ваш класс DVD не реализует Comparable, но это предположение. Вам нужно будет посмотреть Comparable, если вы не знаете, что это такое.
Ответ №3:
Для метода бинарного поиска требуется java.util.List
не массив, вы можете преобразовать массив в список с помощью java.util.Arrays#asList()
, но DVD также потребуется реализовать java.util.Comparator
, вы можете найти основы для этого здесь.
Ответ №4:
Хотя это и не имеет прямого отношения к вашему вопросу, код создает новый, больший массив для каждого добавленного DVD, однако исходный массив начинается не с 0, а со 100 элементов; в массиве всегда будет 100 нулевых элементов. В любом случае вам действительно следует использовать что-то вроде ArrayList
вместо массива; вам не придется беспокоиться об изменении размера, и вы всегда можете получить массив из ArrayList
, если он вам абсолютно необходим.
Вы пытаетесь использовать форму с двумя аргументами Collections.binarySearch()
. Первым аргументом должно быть List
количество DVD-дисков. ArrayList
это List
(технически, он реализует List
интерфейс), что является другой причиной, по которой вы должны хранить DVD-диски с использованием ArrayList
. Второй аргумент — это элемент для поиска. Ваш код не компилируется, потому что массив не является объектом класса, реализующего List
интерфейс. Кроме того, в форме этого метода с двумя аргументами элементы, содержащиеся в списке (DVD-диски), должны реализовываться java.util.Comparable
, документация по которым находится здесь.
Ответ №5:
Поскольку у вас есть массив, а не List
, вы должны использовать Arrays.binarySearch()
, а не Collections.binarySearch()
.