线性搜索链表

时间:2015-08-03 20:12:06

标签: java search linked-list linear

我正在尝试对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;
}

2 个答案:

答案 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()返回元素类型,而不是迭代器