質問
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
}
このような実装を知っている人はいますか
編集:回答(すべて正しい、投票済み)を表示した後、マップを並べ替える必要があることに気付きました。 「ソート済み」と言うとき、私が意味するのは、特定の順序で値を持たせたい、つまり変更できるようにするということだけです。これは元の質問ではないことは知っていますが、私はそれが必要であることに気付きました。
編集2 :私は優柔不断です。必要なのは、並べ替えられた地図ではなく、順序付けられた地図です。混乱してすみません、人々。
解決
特定の順序でアイテムが必要な場合は、 LinkedHashMap はあなたの友達です-アイテムを挿入順に保持します。 TreeMapは、指定したComparatorまたはキーのcompareToメソッドで定義された順序でアイテムを保持します。
他のヒント
順序付けられたマップについては、 LinkedHashMap
。これにより、キーが挿入順に保持されます。
SortedMap を使用する場合code>
は、キーをソートされた順序に保ちます。 ( TreeMap
は最も一般的な実装です。)
使用できるのは map.entrySet()
です。これにより、MapEntriesのセットを反復処理できます。
javadoc をご覧くださいもう少し詳しく。
すでに実用的な答えがたくさんあります。しかし、質問に直接答える...
JavaでMapインターフェイスとListインターフェイスの両方を実装するクラスが存在する場合、私はさまよいました。
...それは単純に不可能であることを言及する価値があります。 remove(Object)
メソッドが障害です。
Map
インターフェースの署名は次のとおりです。
V remove(Object key);
そして List
インターフェースでは:
boolean remove(Object o);
< code> 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());