Проблема с бинарным поиском?

#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() .