将条件作为参数传递给迭代器

时间:2012-05-15 12:19:51

标签: java eclipse parameter-passing

我差不多完成了我的项目,虽然有一件事我无法过去。

让我先说一下:

  

类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();
}

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

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

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

3 个答案:

答案 0 :(得分:3)

考虑使用Guava的馆藏扩充。在这种情况下,具体为Collections2.filter()Collections2.transform()。如果这样做,您可以提供一个Predicate来描述您关心的条件,并使用filter()来运行集合并返回一组匹配元素。这是一个非常本地化的例子:

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

但如果你采用Guava做事的方式,那么你可能不会更加彻底地改变结构。

答案 1 :(得分:2)

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

  1. 创建一个Filter<T>接口,该接口有一个方法,我们称之为boolean match(T obj)
  2. Filter<Element>传递给迭代器,该迭代器实现match方法以测试条件,例如return "The name I'm looking for".equals(element.getName());
  3. 如果filter.match(element)然后result.add(element),则在您的循环中进行测试。
  4. 修改
    那么你的新方法就是:

    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 :(得分:0)

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