链表的线性搜索
Linear search of a linked list
我正在尝试对 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;
}
看看这里的代码:
Iterator<Contributor> iter = contributorList.iterator();
while (iter.hasNext()) {
if (iter.next().equals(intSearchKey)) {
return true;
}
iter = (Iterator<Contributor>) iter.next();
}
请注意,在第一次调用 .next()
时,您希望它成为 return 一个 Contributor
对象。在第二种情况下,您期望它是 return 可以转换为 Iterator<Contributor>
.
的东西
我认为您对迭代器在 Java 中的工作方式存在根本性的误解,这就是代码不起作用的原因。迭代器上的 .next()
方法会自动向前推进迭代器 - 它会修改接收器 - 并且 return 是正在迭代的集合中的下一个值。这意味着您不应在调用 .next()
时为 iter
分配新值,因为您的类型不兼容。相反,您应该像这样构造代码:
Iterator<Contributor> iter = contributorList.iterator();
while (iter.hasNext()) {
Contributor currElem = iter.next();
if (currElem.equals(intSearchKey)) {
return true;
}
}
请注意,您只在循环中调用一次 .next()
来获取值,然后在当前循环迭代中使用该值。您永远不会重新分配 iter
,因为 iter
在您重复调用 .next()
.
时会自动遍历集合
希望对您有所帮助!
此行将 Contributor 对象与 String 进行比较。
if (iter.next().equals(searchKey)) {
没有看到 Contributor 对象,我猜你想要这样的东西
if (iter.next().getKey().equals(searchKey)) {
此外,这一行没有意义:
iter = (Iterator<Contributor>) iter.next();
iter.next() returns 元素类型,不是迭代器
我正在尝试对 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;
}
看看这里的代码:
Iterator<Contributor> iter = contributorList.iterator();
while (iter.hasNext()) {
if (iter.next().equals(intSearchKey)) {
return true;
}
iter = (Iterator<Contributor>) iter.next();
}
请注意,在第一次调用 .next()
时,您希望它成为 return 一个 Contributor
对象。在第二种情况下,您期望它是 return 可以转换为 Iterator<Contributor>
.
我认为您对迭代器在 Java 中的工作方式存在根本性的误解,这就是代码不起作用的原因。迭代器上的 .next()
方法会自动向前推进迭代器 - 它会修改接收器 - 并且 return 是正在迭代的集合中的下一个值。这意味着您不应在调用 .next()
时为 iter
分配新值,因为您的类型不兼容。相反,您应该像这样构造代码:
Iterator<Contributor> iter = contributorList.iterator();
while (iter.hasNext()) {
Contributor currElem = iter.next();
if (currElem.equals(intSearchKey)) {
return true;
}
}
请注意,您只在循环中调用一次 .next()
来获取值,然后在当前循环迭代中使用该值。您永远不会重新分配 iter
,因为 iter
在您重复调用 .next()
.
希望对您有所帮助!
此行将 Contributor 对象与 String 进行比较。
if (iter.next().equals(searchKey)) {
没有看到 Contributor 对象,我猜你想要这样的东西
if (iter.next().getKey().equals(searchKey)) {
此外,这一行没有意义:
iter = (Iterator<Contributor>) iter.next();
iter.next() returns 元素类型,不是迭代器