【问题标题】:Need help stepping through a java iterator需要帮助单步执行 Java 迭代器
【发布时间】:2011-02-12 03:08:19
【问题描述】:

假设我已经创建了一个名为“iter”的迭代器和一个名为“database”的数组列表。我希望能够查看 arraylist 并查看 arraylist 中的任何元素是否等于名为“test”的字符串。如果是,那么我想将该元素添加到另一个列表中。

while(iter.hasNext()) {
    if(database.next() == test) { 
        database.next().add(another_list);
    }
}

我做错了什么?我对java中的迭代器完全陌生。我需要编写自己的迭代器类吗?任何代码示例将不胜感激。谢谢

【问题讨论】:

    标签: java iterator


    【解决方案1】:

    您的代码的问题是每次调用.next() 时,它都会将迭代器向前推进到下一个位置。这意味着这段代码

    if(database.next() == test) { 
        database.next().add(another_list);
    }
    

    不会按预期工作,因为第一次调用 database.next() 不会返回与第二次调用 database.next() 相同的值。要解决此问题,您需要创建一个临时变量来保持新值,如下所示:

    while(iter.hasNext()) {
        /* type */ curr = iter.next();
        if(curr == test) { 
            curr.add(another_list);
        }
    }
    

    (填写被迭代内容的真实类型代替/* type */)

    但是,在许多情况下,您不需要显式使用迭代器。大多数 Collections 类型都实现了Iterable 接口,在这种情况下你可以写

    /* container */ c;
    for(/* type */ curr: c) {
        if(curr == test) { 
            curr.add(another_list);
        }
    }
    

    希望这会有所帮助!

    【讨论】:

    • 你的代码的问题是每次调用 .next() 时,它都会将迭代器向前推进到下一个位置 那肯定是 a问题。此外,添加是向后的:应该是another_list.add(curr)。 foreach 循环语法是for (Type var : col),而不是“in”。
    • @Mark Peters- 没有任何类型信息,很难知道这是否正确。也许容器是Lists 的集合?另外,感谢您发现 :/in 事故 - 我刚刚解决了这个问题。
    • 不太可能,因为他将元素与字符串进行比较以获得相等性。无论哪种方式,他都非常清楚地表示他想将元素添加到另一个列表中,而不是添加另一个列表到元素中。我很难看到歧义。无论如何都赞成,因为您发现了两个“下一个”调用,这是Iterator 新手中的常见问题。
    【解决方案2】:
    if(database.contains("test"))
    {
       another_list.add("test");
    }
    
    1. 您可以使用内置方法contains(...)
    2. 您应该使用 equals(...) 进行数据比较
    3. 查看javadoc,看看是否已经有适合您目的的方法

    【讨论】:

    • 这具有误导性 - 测试不是(必然)发帖人问题中的字符串。也许将其修改为不是字符串?
    • @nrobey: "a String called test..." 现在它的值是否等于 "test" 是一个有效点。应该是database.contains(test)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2023-03-24
    相关资源
    最近更新 更多