【问题标题】:Passing a condition as a parameter to an iterator将条件作为参数传递给迭代器
【发布时间】:2012-05-15 12:19:50
【问题描述】:

我几乎完成了我的项目,尽管有一件事我无法克服。

让我先引用它:

Board 类还必须提供一个返回迭代器的方法,该迭代器将 返回板上的所有元素(不包括机器人携带的物品) 满足给定条件。条件的示例是所有具有 至少 1000 Ws 的能量(迭代器将不会返回墙壁或惊喜 盒子,因为它们没有已知的能量),某些子范围内的所有元素 板子,板上的所有项目等。

所以,我有一个带有元素的板。 (机器人、某些物品、墙壁……)

在课堂上我们已经看到了如何实现Iterable,并在需要时重写方法iterator(),但是现在我需要将条件作为参数传递给这个迭代器?

我最好的方法是在课堂上使用这种方法:

    public Iterator<Element> getAllElementsByCondition(boolean condition) {
    HashSet<Element> result = new HashSet<Element>();
    for (Element element : elements)
        if (Board.this.hasElement(element) && condition)
            result.add(element);
    return result.iterator();
}

但是,如您所见,我不知道如何将条件作为参数传递给方法。

我也不知道这是否是我创建迭代器的方式。

编辑:
我不允许使用任何外部库

【问题讨论】:

标签: java eclipse parameter-passing


【解决方案1】:

考虑使用 Guava 的集合扩充。在这种情况下,特别是 Collections2.filter()Collections2.transform()。如果你这样做,你可以提供一个Predicate 来描述你关心的条件,并且只需使用filter() 来遍历集合并返回匹配元素的集合。这是一个非常本地化的示例:

public Iterator<Element> getAllElementsByCondition(Predicate<Element> condition) {
  return Collections2.filter(elements, condition).iterator(); 
}

但并不是说如果你接受Guava 的做事方式,你可能会更彻底地改变结构。

【讨论】:

  • 我不允许使用任何外部库 :(
  • 嗯。这种约束从何而来?无论如何,@assylias 可能是次优。重新实现类似 Guava 提供的东西。无法从您的问题中看出您需要多大的灵活性。您是在问如何实现Iterator
【解决方案2】:

假设您不允许使用像 Guava 这样的外部库,您可以:

  1. 创建一个Filter&lt;T&gt; 接口,它有一个方法,我们称之为boolean match(T obj)
  2. Filter&lt;Element&gt; 传递给您的迭代器,该迭代器实现match 方法来测试条件,例如return "The name I'm looking for".equals(element.getName());
  3. 在循环中测试filter.match(element) 然后result.add(element)

编辑
您的新方法将是:

public Iterator<Element> getAllElementsByCondition(Filter<Element> filter) {

你会这样称呼它:

Iterator<Element> it = getAllElementsByCondition(new Filter<Element> () {
    public boolean match(element candidate) {
        return /* Enter your condition here */;
    }
});

条件可以是例如:

candidate.getEnergy() > 1000

【讨论】:

  • 我想这就是我要找的东西,但我并不完全理解它......我在界面部分和你在一起。但是,第 2 步,你能澄清一下吗?
  • @AdFundum 查看我的编辑。你甚至可以调用Filter 接口Condition。例如,您可以将 match 替换为 satisfiedBy。这样你就可以坚持你的高级目标语言。
  • 非常感谢,我现在明白了!干杯!
【解决方案3】:

我认为你应该澄清一下任务。我想你的方法应该有效,尽管它应该缩小到像getAllElementsWithEnergyGreaterThan(int minEnergy) 这样的东西。在你的循环中,你将你的能量与 minEnergy 进行比较。

【讨论】:

  • 我认为我的分配者也应该澄清任务,但遗憾的是,他们没有:/
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2018-09-30
  • 2021-11-28
相关资源
最近更新 更多