我遇到了一些问题,试图将一个公共迭代器放在一个类中来读取类中的Map并在其他类中实现这个迭代器。或者换句话说,
我有类A.类A包含一个私有HashMap,我想通过迭代这个映射的公共迭代器来访问它。
我也有B类。我正在尝试在B类中运行这个迭代器来读取A类的内容。
这可能看起来有点迂回(或者更确切地说,很多回合),但我的作业指定A类中的数据系统对其他类隐藏,并建议使用公共迭代器来访问数据。有一个例子说明了B类中的方法可能是什么样的,我已经尽力遵循了这个方法。
但是,无法让它发挥作用。
这是我的代码的模型。我尝试编译它,它的工作原理与我的真实代码完全相同。
// this is class A
public class Giant {
private Map<Item, Integer> myMap = new HashMap<Item, Integer>();
// add a bunch of items to the map, check if they worked fine
public Iterator<Map.Entry<Item, Integer>> giantIterator = myMap.entrySet().iterator();
}
// and this is in class B
public void receive(Giant mouse){
System.out.println("I've started!");
Iterator<Map.Entry<Item, Integer>> foo = mouse.giantIterator;
while (foo.hasNext()) {
Map.Entry<Item, Integer> entry = foo.next();
System.out.println("I'm working!");
}
}
我还有一个testclass,它创建任一类的对象,然后运行receive
方法。
我收到消息“我已经开始了!”但不是“我在工作!”
同时,如果我在任一类中有两个迭代器打印toString
,则toStrings是相同的。
我不能简单地将我应该在B类中执行的操作移动到A类,因为迭代器有几种不同的方法,并且用于每种方法稍微不同的东西。
我有点难过。我是否遗漏了语法中的内容?我输错了什么?我是否完全搞砸了它应该如何工作?这只是不可能吗?
答案 0 :(得分:3)
尝试通过以下函数公开迭代器:
public class Giant {
private Map<Item, Integer> myMap = new HashMap<Item, Integer>();
public Iterator<Map.Entry<Item, Integer>> getGiantIterator() {
return myMap.entrySet().iterator();
}
}
在B级改变:
Iterator<Map.Entry<Item, Integer>> foo = mouse.giantIterator;
到
Iterator<Map.Entry<Item, Integer>> foo = mouse.getGiantIterator();
这样,在需要之前不会创建迭代器。
编码它的方式是在地图仍为空时创建迭代器。我怀疑这可能是你问题的根源。
答案 1 :(得分:2)
构造A时构造迭代器,此时Map为空。
创建一个返回最新版本的方法getIterator()。
答案 2 :(得分:0)
如果你有一个迭代器,并且你想要各种类来访问它,那么将该变量设置为“static”。