【问题标题】:Issue with binary search?二进制搜索的问题?
【发布时间】:2017-03-04 08:07:09
【问题描述】:

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

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

这是说我的二进制搜索有问题,但我不知道为什么。

如果你需要我,我可以发布我制作的其他 2 个课程,但我真的很困惑为什么它没有通过。

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

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

修改电影程序,使其保持按导演排序的 DVD。为了产生有效的代码,不要应用排序来保持 DVD 的排序。 改用重新设计方法添加,以便将 DVD 插入排序集合并生成排序集合。 此外,实施一种有效的方法来搜索导演给定的 DVD。方法应称为 searchForDVD。它应该只有字符串类型的形式参数,提供我们正在搜索的导向器。返回类型应该是一个整数,它指定 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 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;
    }

}

【问题讨论】:

  • 在您的问题中包含错误消息
  • 你用静态方法binarySearch写了一个类Collections吗?

标签: java binary-search


【解决方案1】:

二分查找的API是

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

列表必须由 Comparable 接口的元素组成。 DVD 对象是否实现了“Comparable”接口?

【讨论】:

    【解决方案2】:

    它告诉你问题出在哪里:Collection 上没有采用这两个参数的方法。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        虽然与您的问题没有直接关系,但代码会为每张添加的 DVD 创建一个更大的新数组,但原始数组的开头不是 0,而是 100 个元素;数组中总会有 100 个空元素。无论如何,您确实应该使用ArrayList 之类的东西而不是数组;您不必担心调整大小,如果您绝对需要,您可以随时从ArrayList 获取一个数组。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2013-09-19
            • 2011-09-16
            • 2021-09-18
            • 2020-11-16
            • 1970-01-01
            • 2010-09-19
            • 1970-01-01
            • 2022-01-05
            • 1970-01-01
            相关资源
            最近更新 更多