【问题标题】:Java Iterator not behaving properlyJava 迭代器行为不正常
【发布时间】:2015-07-22 14:19:20
【问题描述】:

由于某种原因,这里的迭代器无法正常工作。我调试了代码,it1 有元素。但是,当谈到返回之前的行时,是空的。有什么提示吗?

private Tasks loadChangeStatusOnTasks(final Tasks updatedTasks, final List<Boolean> changeStatusList) {
        final Iterator<Task> it1 = updatedTasks.getTasks().iterator();
        final Iterator<Boolean> it2 = changeStatusList.iterator();
        while(it1.hasNext() && it2.hasNext()) {
            it1.next().setAssigneeChanged(it2.next().booleanValue());
        }
        final Tasks tasks = new Tasks(new ArrayList<TaskDTO>());
        tasks.setTasks(IteratorUtils.toList(it1));
        return tasks;
    }

【问题讨论】:

  • 一个迭代器只能迭代一次。
  • 我们这里没有足够的信息来帮助您。首先,我们不知道Tasks 是什么。请展示一个简短但完整的程序来说明问题。 (njzk2的评估是正确的,但你应该原则上解决这个问题......)
  • “空”是什么意思?你的意思是它已经走到了尽头? it1.hasNext() == false?这是非常值得期待的。
  • 感谢你们的帮助。我认为 njzk2 可能有钥匙。我将先尝试一下,我会稍微更新一下@JonSkeet 的代码。我不得不说很荣幸你看到了这段代码,很荣幸能和你聊天。你是开发者的榜样,我的朋友! ;-)

标签: java list oop collections iterator


【解决方案1】:

当你到达tasks.setTasks(IteratorUtils.toList(it1))时,it1已经耗尽:它的所有元素都已经被消耗掉了!

如果您想创建一个新列表并分配它,只需执行以下操作:

return new Tasks(new ArrayList<>(updatedTasks.getTasks()));

【讨论】:

  • 感谢您的回答 Jean,但我该如何尊重逻辑?如果我使用您的 return 语句,它只会像以前一样返回列表,不是吗?
  • 是的,但是您希望IteratorUtils.toList(it1) 做什么?不同之处在于您在每个Task 上调用了setAssigneeChanged。所以修改了列表的内容
【解决方案2】:

迭代器已经在之前的 while 循环中被迭代过,并且没有更多的 .hasNext() 元素。这就是为什么 IteratorUtils.toList() 会产生一个空列表。

一种解决方案可能是首先创建列表并遍历列表以从另一个迭代器设置 assigneeChanged 属性。

【讨论】:

    猜你喜欢
    • 2014-07-30
    • 2016-12-19
    • 2011-02-05
    • 2016-04-22
    • 2016-09-19
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多