我是新手,我有一个问题。
我有一张地图。我必须遍历地图并构建迭代器。
示例:
public Iterable<Test> getTests(Map<String, Test> testMap,
Set<String> strings)
{
//loop tru the set of strings and build iterator.
for(final String test1 : strings)
{
Test test = testMap.get(test1);
//build a iterator. not a list.
}
return iterator
}
我该怎么做?
答案 0 :(得分:6)
首先,您的方法返回的是Iterable
,而不是Iterator
。 Map
,Set
和List
全部实施Iterable
,因此可能比您想象的要容易。
其次,Iterable
只是一个具有iterator()
方法的类,它返回Iterator
。
所以我只想构建一个List
的结果然后返回它。如果您确实想要返回Iterator
,我会在列表中调用iterator()
并返回 。
答案 1 :(得分:3)
跳过你的Iterator / Iterable混淆(Iterable基本上是一个Iterator工厂......所以你需要写一个Iterator),我想你的意思是这样的:
Iterator<Test> getTests(final Map<String,Test> testMap, final Set<String> strings) {
return new Iterator<Test>() {
private final Iterator<String> keyIter = strings.iterator();
private String lastKey;
public boolean hasNext() { return keyIter.hasNext(); }
public Test next() { lastKey = keyIter.next(); return testMap.get(lastKey); }
public void remove() { testMap.remove(lastKey); }
};
}
如果你想要返回一个Iterable,那么,那就必须是那些工厂:
Iterable<Test> getTests(final Map<String,Test> testMap, final Set<String> strings) {
return new Iterable<Test>() {
public Iterator<Test> iterator() {
return new Iterator<Test>() {
private final Iterator<String> keyIter = strings.iterator();
private String lastKey;
public boolean hasNext() { return keyIter.hasNext(); }
public Test next() { lastKey = keyIter.next(); return testMap.get(lastKey); }
public void remove() { testMap.remove(lastKey); }
};
}
};
}
要获得额外的功劳,您可以参数化此方法本身并使用通用方法迭代地图中的选择:
Map<String, Action> map;
Set<String> keys;
for (Action x : filterMap(map, keys)) {
}
答案 2 :(得分:2)
自Collection
扩展Iterable
以来,正确的解决方案是将测试添加到某种集合中,例如ArrayList
。
Collection<Test> tests = new ArrayList<Test>();
for (String key : strings) {
Test t = testMap.get(key);
if (t != null)
tests.add(t);
}
return tests;
答案 3 :(得分:1)
如果你想真正返回Iterable最简单的方法就是这个
public Iterable<Test> getTests(Map<String, Test> testMap, Set<String> strings)
{
testMap = new HashMap<String, Test>(testMap);
testMap.keySet().retainAll(strings);
return testMap.values();
}
如果要返回迭代器,请将最后一行替换为
return testMap.values().iterator();
如果您不关心对传入的地图的修改,请跳过初始临时地图构建。
编辑: 删除了没有它的Map接口上使用克隆。
答案 4 :(得分:1)
作为黑暗中的刺刀,你可能正在寻找的是Map.entrySet.iterator()
。它允许您迭代地图的条目。
注意:我知道这不是OP问题的答案,但我猜他们正在回答他们真正想要的东西。如果这个猜测结果是错误的,我会再次删除这个答案,以免让人感到困惑。
答案 5 :(得分:0)
Iterable 与 Iterator 不同。 Iterable是你可以迭代的东西,比如List。你使用Iterator。你的问题不清楚你想从getTests()返回什么。
你最好的镜头是创建一个Iterable(如List或Vector)并返回它,或者返回它的Iterator。