0

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

让我先引用它:

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

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

在课堂上我们已经看到了如何实现 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();
}

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

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

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

4

3 回答 3

3

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

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

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

于 2012-05-15T12:25:53.450 回答
1

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

  1. 创建一个Filter<T>接口,它有一个方法,让我们调用它boolean match(T obj)
  2. 将 a 传递Filter<Element>给您的迭代器,该迭代器实现了match测试条件的方法,例如return "The name I'm looking for".equals(element.getName());.
  3. filter.match(element)如果then在你的循环中测试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
于 2012-05-15T12:26:29.000 回答
0

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

于 2012-05-15T12:26:05.333 回答