二分搜索问题?

时间:2016-10-21 22:36:48

标签: java binary-search

所以我正在为我的CS类编写代码,它要求我使用二进制搜索。

但是,每当我运行代码时,都会收到一条错误,指出this

这说我的二进制搜索存在问题,但我无法弄清楚原因。

如果你需要我,我可以发布我制作的其他两个课程,但我真的不知道为什么它没有通过。

我觉得这是一个愚蠢的错误,我的衔接或调用搜索。 提前感谢朋友们。

编辑: 如果它对您有更好的帮助,那么这就是代码的要求。

修改电影程序,以便按照导演对DVD进行排序。为了生成有效的代码,请不要应用排序来保持DVD的排序。 改为重新设计方法,以便将DVD插入已排序的集合并生成已排序的集合。 此外,实施一种有效的方法来由导演搜索给定的DVD。方法应该称为searchForDVD。它应该只有String类型的形式参数,它提供了我们正在搜索的导演。返回类型应该是一个整数,指定DVD所在阵列中的索引。当搜索不成功时,方法返回-1。方法searchForDVD应该在DVD集合类中。 修改main方法,以便最后通过执行一次成功搜索和一次不成功搜索来测试方法searchForDVD。 显示在成功搜索中找到的DVD,否则写下相应的评论。

PROGRAM RUN大纲:

显示所有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 Collection\n\n";

        report += "Number of DVDs: " + count + "\n";
        report +="Total cost: " + fmt.format(totalCost) + "\n";
        report += "Average cost: " + fmt.format(totalCost/count);

        report += "\n\nDVD List: \n\n";

        for (int dvd = 0; dvd < count; dvd++)
            report += collection[dvd].toString() + "\n";

        return report;
    }

}

5 个答案:

答案 0 :(得分:1)

二进制搜索的API是

public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key)

列表必须由Comparable接口的元素组成。 DVD对象是否实现了&#34; Comparable&#34;接口

答案 1 :(得分:0)

它告诉你问题是什么:Collection上没有采用这两个参数的方法。

第一个必须是某个类或接口的列表,第二个必须实现Comparable。看来您的DVD类没有实现Comparable,但这是猜测。如果你不知道那是什么,你需要查找Comparable。

答案 2 :(得分:0)

二进制搜索方法需要java.util.List而不是数组,您可以使用java.util.Arrays#asList()将数组转换为列表,但DVD也需要实现java.util.Comparator,您可以找到这个here的基础知识。

答案 3 :(得分:0)

尽管与您的问题没有直接关系,但代码会为每个添加的DVD创建一个新的更大的数组,但原始数组的开头不是0而是100个元素;数组中总会有100个null元素。你应该真的使用像ArrayList这样的东西而不是数组;您不必担心调整大小,如果您绝对需要,可以随时从ArrayList获取阵列。

您正在尝试使用Collections.binarySearch()的双参数形式。第一个参数应该是List个DVD。 ArrayListList(从技术上讲,它实现了List接口),这是您应该使用ArrayList存储DVD的另一个原因。第二个参数是要搜索的项目。您的代码无法编译,因为数组不是实现List接口的类的对象。此外,使用此方法的双参数形式,列表中保存的项目(DVD)必须实现java.util.Comparable,其文档为here

答案 4 :(得分:0)

由于您有一个数组而不是List,因此您应该使用Arrays.binarySearch(),而不是Collections.binarySearch()