链表的线性搜索

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 元素类型,不是迭代器