我差不多完成了我的项目,虽然有一件事我无法过去。
让我先说一下:
类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();
}
但是,如您所见,我不知道如何将条件作为参数传递给方法。
我也不知道这是否是我创建迭代器的方式。
编辑:
我不允许使用任何外部库
答案 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这样的外部库,您可以:
Filter<T>
接口,该接口有一个方法,我们称之为boolean match(T obj)
。Filter<Element>
传递给迭代器,该迭代器实现match
方法以测试条件,例如return "The name I'm looking for".equals(element.getName());
。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 :(得分:0)
我认为你应该澄清这项任务。我想你的方法应该有效,尽管它应该缩小到像getAllElementsWithEnergyGreaterThan(int minEnergy)
这样的东西。在你的循环中,你将你的能量与minEnergy进行比较。