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ではなくを返していIteratorます。MapSet、およびListすべて を実装Iterableしているので、思ったより簡単かもしれません。

第 2 に、は単にを返すメソッドをIterable持つクラスです。iterator()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

暗闇の中で突き刺すように、あなたが探しているのはMap.entrySet.iterator(). これにより、マップのエントリを反復処理できます。

注:これはOPの質問に対する回答ではないことはわかっていますが、実際に探しているものに回答することは私の推測です. この推測が間違っていることが判明した場合は、この回答を再度削除して、人々の混乱を防ぎます。

于 2009-05-22T07:17:04.127 に答える
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 に答える
0

IterableはIteratorとは異なるものです。Iterable は、List のように繰り返し処理できるものです。そのためにイテレータを使用します。あなたの質問は、getTests() から何を返したいのか明確ではありません。

あなたの最善の方法は、Iterable (List や Vector など) を作成してそれを返すか、その Iterator を返すことです。

于 2009-05-21T20:29:59.877 に答える