4

TreeMap をラップするクラス MyMap があります。(犬のコレクションであり、キーが文字列であるとします)。

public class MyMap {
   private TreeMap<String, Dog> map;
...
}

for-each ループで MyMap を反復可能にしたいと思います。私のクラスが LinkedList ラッパーであった場合、どのようにそれを行うかを知っています。

public class MyList implements Iterable<Dog> {
   private LinkedList<Dog> list;
   ...
   public Iterator<Dog> iterator() {
      return list.iterator();
   }
}

しかし、TreeMap には iterator() がないため、このような解決策は TreeMap では機能しません。では、どうすれば MyMap を反復可能にできますか?

そして、MyMap が (TreeMap の代わりに) HashMap をラップする以外は同じ質問です。

ありがとう。

4

4 に答える 4

8
public Iterator<Dog> iterator() {
      return map.values().iterator();
}
于 2010-01-12T19:24:00.400 に答える
6

これは、マップ自体ではなく、マップのキーまたは値のみを反復できるためです。

通常、これを行うことができます:

for( Object value : mymap.values()  ){
  System.out.println(value);
}

だから、私が提案しているのは、あなたのマップにはイテラブルが必要ですか? 値を取得したいだけの場合ではありません...またはキー自体。

また、 ForwardingListなどの Google の転送コレクションの使用を検討してください。

于 2010-01-12T19:23:11.150 に答える
4
public class MyMap implements Iterable<Dog> {
   private TreeMap<String, Dog> map;
   ...
   @Override
   public Iterator<Dog> iterator() {
      return map.values().iterator();
   }
}

map.values() は、マップに含まれる犬のコレクション ビューです。コレクションの反復子は、対応するキーがツリーに表示される順序で値を返します。ジョナサン・ファインバーグに感謝します。

于 2010-01-12T20:38:08.367 に答える
1

1 つの可能性として、Set を返すentrySet()メソッドを定義し、Set を反復処理することが考えられます。

For-each 反復は次のようになります。

for (Map.Entry<String,Integer> m: someMap.entrySet()){
   System.out.println("Key="+m.getKey()+" value="+m.getValue());
}
于 2010-01-12T19:34:03.423 に答える