Java迭代器

时间:2009-05-21 20:16:57

标签: java map iterator

我是新手,我有一个问题。

我有一张地图。我必须遍历地图并构建迭代器。

示例:

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
}

我该怎么做?

6 个答案:

答案 0 :(得分:6)

首先,您的方法返回的是Iterable,而不是IteratorMapSetList全部实施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。