1

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

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

例子:

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
}

我怎样才能做到这一点?

4

6 回答 6

6

首先,您的方法返回的是Iterable,而不是IteratorMap, Set, 和List所有实现Iterable,所以它可能比你想象的要容易。

其次, anIterable只是一个具有iterator()返回 an 的方法的类Iterator

所以我会简单地构建一个List结果然后返回它。如果你真的想返回一个Iterator,我会改为调用iterator()列表并返回那个

于 2009-05-21T20:23:57.940 回答
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)) {
}
于 2009-05-21T20:36:04.233 回答
2

由于Collectionextends 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;
于 2009-05-21T20:22:02.263 回答
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();

如果您不关心对传入映射的修改,请跳过初始临时映射构建。

编辑:在没有它的地图界面上删除了克隆的使用。

于 2009-05-21T20:45:17.443 回答
1

作为在黑暗中的刺,您可能正在寻找的是Map.entrySet.iterator(). 它允许您遍历地图的条目。

注意:我知道这不是对 OP 问题的回答,但这是我在回答他们实际寻找的问题时的猜​​测。如果这个猜测结果是错误的,我会再次删除这个答案,以免人们感到困惑。

于 2009-05-22T07:17:04.127 回答
0

IterableIterator不同。Iterable 是您可以迭代的东西,例如 List。您为此使用迭代器。您的问题不清楚您想从 getTests() 返回什么。

您最好的方法是创建一个 Iterable(如 List 或 Vector)并返回它,或者返回它的 Iterator。

于 2009-05-21T20:29:59.877 回答