0

文字列を整数にマップするクラスを作成しています。特定の文字列に関連付けられた整数を取得し、を実装する別のクラスとして定義されているエントリを反復処理できるようにしたいMap.Entry<String, Integer>

現在私はこれを持っています:

public class MyMap implements Iterable<MyEntry> {

private final Map<String, Integer> wrappedMap = 
    new HashMap<String, Integer>();

@Override
public Iterator<MyEntry> iterator() {
    return wrappedMap.entrySet().iterator();
}

    //more methods

}

MyEntryがを実装していても、型の不一致のためにコンパイルされませんMap.Entry<String, Integer>

Map.Entryのカスタム実装を作成する方法はありますか?私が見落としているこれを行うためのより簡単な方法はありますか?よろしくお願いします!

4

3 に答える 3

2

MyEntry はハッシュマップの一部ではないため、コンパイルされていません。MyEntry のリストを返したい場合は、データ要素を MyEntry インスタンスにコピーし、それをコレクションにロードする必要があります。これは遅くなり、かなりの量のメモリを消費します。

そのはず:

@Override
public Iterator<Map.Entry<String,Integer>> iterator() {
    return wrappedMap.entrySet().iterator();
}

への呼び出しentrySet()は、ハッシュマップ内のマッピングを含む Set を返します。Entryしたがって、反復子はオブジェクトを反復処理する必要があります

于 2013-01-23T02:23:10.167 に答える
2

通常のマップだけを使用しないのはなぜですか?

Map<String, MyEntry> map = new HashMap<String, MyEntry>();

次に、イテレータは次のようになります。

Iterator<MyEntry> iter = map.values().iterator();
于 2013-01-23T02:31:58.933 に答える
1

MyEntry実装されていても、が実装されMap.Entry<K,V>ているわけではありません。のようなクラスの場合、その区別は人間には直感的に理解できないので、代わりにとメソッドを持つクラスを考えてみましょう。のサブクラスですか? そう思うかもしれませんが、そうではありません。 aでは を呼び出すことは合法ですが、 a では明らかに違法です。で有効なすべてのアクションをサポートできるわけではないため、これは間違いなくサブクラスではなく、自由に置換することはできません。Iterator<MyEntry>Iterator<Map.Entry<K,V>>IteratorBox<E>.put(E).contains(E)Box<Dinosaur>Box<Animal>Box<Animal>.put(someMammal)Box<Dinosaur>Box<Dinosaur>Box<Animal>

コンパイラの観点からは、同じ懸念がイテレータにも当てはまる可能性があるため、オーバーロード.iterator()して のインスタンスではないオブジェクトを返すことはできませんIterator<K,V>

于 2013-01-23T02:22:33.733 に答える