JavaでMap
インターフェイスとList
インターフェイスの両方を実装するクラスがあるかどうか疑問に思いました。
主にMap
であるデータ構造があります。文字列(ID)をImage
sにマップします。ただし、コードの特定の部分で、使用可能なすべてのID Images
をユーザーに提示する必要があります。これまでのところ、これを行う唯一の方法は次のように書くことです。
for (String id : myMap.keySet()) {
// get the image like this "myMap.get(id)"
}
したがって、Map
とList
の両方を実装するクラスがあれば、次のように簡単に記述できます。
for (Image img : myMap) {
// the image is img
}
誰かがそのような実装を知っていますか?
[〜#〜] edit [〜#〜]:回答(すべて正解、投票済み)を表示した後、マップも並べ替える必要があることに気付きました。私が「ソート済み」と言うとき、私が意味するのは、特定の順序で値を持たせたいということです。つまり、変更できるようにします。これが元の質問ではないことはわかっていますが、それが必要であることに気づきました。
編集2:私は優柔不断のようです。必要なのは、並べ替えられたマップではなく、順序付けられたマップです。混乱してすみません、人々。
特定の順序でアイテムが必要な場合は、 LinkedHashMap が友達です-アイテムを挿入順序で保持します。 TreeMapは、指定したコンパレータまたはキーのcompareToメソッドのいずれかによって定義された順序でアイテムを保持します。
順序付けられたマップについては、 LinkedHashMap
を参照してください。これにより、キーが挿入順に保持されます。
SortedMap
を使用すると、キーが並べ替えられた順序で保持されます。 ( TreeMap
が最も一般的な実装です。)
使用できるのはmap.entrySet()
です。これにより、MapEntriesのセットを反復処理できます。
詳細については、 javadoc を確認してください。
あなたはすでにたくさんの実用的な答えを持っています。しかし、質問に直接答える...
JavaでMapインターフェイスとListインターフェイスの両方を実装するクラスがあるかどうか迷っていました。
...それは単に不可能であることに言及する価値があります。 remove(Object)
メソッドが障害です。
Map
インターフェースでは、その署名は次のとおりです。
V remove(Object key);
そして、List
インターフェースでは次のようになります。
boolean remove(Object o);
Map.values()
メソッドを使用できます。このメソッドはCollection
を返します。
これにより、保存された値のコレクションが得られます
myMap.values()
これを試して:
for (Image img : myMap.values()) {
// the image is img
}
ソートされたマップについては、 Java.util.SortedMap
実装。 Java.util.TreeMap
が最も頻繁な選択です。保証された反復順序が必要な場合は、 Java.util.LinkedHashMap
。要素をマップに配置するのと同じ順序で反復を提供します。または、オプションで、最後にアクセスした順序で。キー(追加後)をマップの最後に移動する場合は、明示的に削除してから再度配置する必要があります。
TreeMap を使用できます。これは、キーの自然順序に従って、またはマップ作成時に提供されるコンパレータによって並べ替えられます。
TreeMap<String, Image> mapByName = new TreeMap<String, Image>(new ByNameComparator());
ここで、ByNameComparator()はコンパレータです。または、values()メソッドを使用し、Collections.sort()を使用して並べ替えることもできます。
Collection<Image> images = mapByName.values();
Collections.sort(images, new BySizeComparator());