我正在尝试对linked list
进行线性搜索。一次搜索是int
,另一次是String
。我究竟做错了什么? **根据建议更新了代码。
在主
内 public static LinkedList<Contributor> contributorList = new LinkedList<>();
String searchKey = "Jones";
int intSearchKey = 45;
System.out.println("Search key " + searchKey + " is found? " + sequentialSearch(contributorList, searchKey));
System.out.println("Search key " + intSearchKey + " is found? " + sequentialSearch(contributorList, intSearchKey));
Called methods
public static <Contributor> boolean sequentialSearch(Iterable<Contributor> contributorList, int intSearchKey) {
Iterator<Contributor> iter = contributorList.iterator();
while (iter.hasNext()) {
if (iter.next().equals(intSearchKey)) {
return true;
}
iter = (Iterator<Contributor>) iter.next();
}
return false;
}
public static <Contributor> boolean sequentialSearch(Iterable<Contributor> contributorList, String searchKey) {
Iterator<Contributor> iter = contributorList.iterator();
while (iter.hasNext()) {
if (iter.next().equals(searchKey)) {
return true;
}
iter = (Iterator<Contributor>) iter.next();
}
return false;
}
答案 0 :(得分:1)
看看你在这里的代码:
now()
请注意,在第一次调用Iterator<Contributor> iter = contributorList.iterator();
while (iter.hasNext()) {
if (iter.next().equals(intSearchKey)) {
return true;
}
iter = (Iterator<Contributor>) iter.next();
}
时,您希望它返回.next()
个对象。在第二种情况下,您希望它返回可以转换为Contributor
的内容。
我认为你对迭代器如何在Java中工作有一个基本的误解,这就是代码不起作用的原因。迭代器上的Iterator<Contributor>
方法自动向前推进迭代器 - 它修改接收器 - 并返回迭代的集合中的下一个值。这意味着您在调用.next()
时不应为iter
分配新值,因为您的类型不兼容。相反,你应该像这样构造代码:
.next()
请注意,您只需在循环中调用Iterator<Contributor> iter = contributorList.iterator();
while (iter.hasNext()) {
Contributor currElem = iter.next();
if (currElem.equals(intSearchKey)) {
return true;
}
}
一次以获取值,然后在当前循环迭代中使用该值。您永远不会重新分配.next()
,因为iter
会在您重复拨打iter
时自动浏览该集合。
希望这有帮助!
答案 1 :(得分:1)
此行将Contributor对象与String进行比较。
if (iter.next().equals(searchKey)) {
如果没有看到贡献者对象,我猜你想要这样的东西
if (iter.next().getKey().equals(searchKey)) {
此外,这条线毫无意义:
iter = (Iterator<Contributor>) iter.next();
iter.next()返回元素类型,而不是迭代器