【问题标题】:Need help using an Iterator在使用迭代器时需要帮助
【发布时间】:2011-02-16 02:12:07
【问题描述】:

我对迭代器完全陌生。我有一个带有字符串对象的名为“Test”的 ArrayList。我将如何使用迭代器类?我已经尝试了我能想到的一切,只是没有意义。感谢您的帮助。

假设我有一个名为“iter”的迭代器。我需要通过我的 ArrayList 来搜索某个字符串。找到该字符串后,我需要将其添加到名为“test2”的不同 ArrayList 中。

while(iter.hasNext()) {
    if(iter.next() == sampleString) {
        test2.add(sampleString);
    }
}

唯一的问题是,当我调用 next() 时,它会将指针移动到下一个字符串,而忽略 ArrayList 中的第一个字符串。我将如何实现它??

【问题讨论】:

  • 我看不出您的示例将如何“忽略第一个字符串”。不过,我建议您在使用 == 进行对象比较时要小心。

标签: java iterator


【解决方案1】:

你不需要一个。 ArrayList 已经是可迭代的了! :-D

ArrayList<String> test = new ArrayList<String>();
test.add("Hello");
test.add("world");
for(String str : test) System.out.println(str);

【讨论】:

  • 我需要创建一个迭代器。这是学校项目的一部分,我需要实现一个迭代器以表明我理解这个概念。
  • 然后我建议发布您的尝试,我们可以从那里开始。 :)
  • 并告诉您的教授更新他们的课程计划并停止使用过时的技术!
  • 迭代器到底是怎么过时的? Iterable 使用迭代器工作,仍然有很多需要直接使用迭代器的情况。
  • @jtahlborn 总的来说,迭代器的构造不如在必要时使用带有自定义比较器的 Collections 框架。
【解决方案2】:

迭代器一般是这样使用的:

while (iter.hasNext()) {
    String nextString = iter.next();
    // Do something with the string...
}

有些人(包括我自己)会更喜欢增强的 for 循环:

for (String nextString : listOfStrings) {
    // Do something with the string
}

for 循环避免了获取显式迭代器引用的需要,并包含nextString 变量声明,使其简洁且范围适当。

【讨论】:

    【解决方案3】:

    问题在于您对 Iterator.next() 的工作原理并不是 100% 了解

    这是直接从 Java API 复制而来的

    E next() -- 返回迭代中的下一个元素。

    这意味着 .next() 将返回一个对象,然后移动到列表中的下一项。

    调用next()时需要存储返回的对象

    while(iter.hasNext()) 
    {
        String temp = iter.next();
        //this is a more old school method but more true to form. 
        //== doesn't necessarily do equality checks on all objects the way
        //you would think 
        if(temp.equals(sampleString)) 
        {
            test2.add(temp);
        }
    }
    

    【讨论】:

    • 创建一个临时文件是关键。谢谢
    • 使用compareTo() 代替equals() 是不好的形式。它混淆了你正在做的事情。如果您只关心两件事是否相等,请使用equals()
    • @jtahlborn 我的cmets关于它更真实的形式实际上只是相对于他的原始版本,它只使用了 == 运算符。尽管它会像使用 String 一样表现,但新程序员可能会开始相信它会根据对象中的特定值检查是否相等,它实际上是在查看对这些对象的引用是否相等。我完全隔开等于将执行相同的任务。我同意它更好,更容易阅读。我更新了代码以反映这一点。
    【解决方案4】:

    迭代器只是理解如何遍历给定数据结构的东西。

    你不明白什么?

    对于List,迭代器将跟踪其在列表中的当前位置并了解如何获取列表中的下一个元素。对于列表之类的东西,它相对简单,但您也可以为其他一些不像列表那么简单的任意数据结构定义一个迭代器。您还可以定义一个执行不同操作的函数,例如向后遍历列表。如果您有关于迭代器的具体问题,请更新您的问题,我们会尽快解决:-)

    【讨论】:

      【解决方案5】:

      迭代器是一种遍历项目集合的方法。遵循该声明,java.util.Collection 扩展 Iterable (public interface Collection&lt;E&gt; extends Iterable&lt;E&gt;)。即所有集合类都是Iterable in somewayiterator() 是获取Iterator 句柄的方法。获得句柄后,您可以遍历项目。

      我以某种方式突出显示,因为并非所有迭代器都允许双向遍历。 ListIterator 允许这样做。

      我会重写你的代码如下

      for(String s : myCollection)
      {
         if(s.equals(sampleString))
         {
            test.add(s);
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 2017-01-09
        相关资源
        最近更新 更多