所以我正在为我的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;
}
}
答案 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。 ArrayList
是List
(从技术上讲,它实现了List
接口),这是您应该使用ArrayList
存储DVD的另一个原因。第二个参数是要搜索的项目。您的代码无法编译,因为数组不是实现List
接口的类的对象。此外,使用此方法的双参数形式,列表中保存的项目(DVD)必须实现java.util.Comparable
,其文档为here。
答案 4 :(得分:0)
由于您有一个数组而不是List
,因此您应该使用Arrays.binarySearch()
,而不是Collections.binarySearch()
。