web-dev-qa-db-ja.com

Javaでの順序付きリストマップの実装

JavaでMapインターフェイスとListインターフェイスの両方を実装するクラスがあるかどうか疑問に思いました。

主にMapであるデータ構造があります。文字列(ID)をImagesにマップします。ただし、コードの特定の部分で、使用可能なすべてのID Imagesをユーザーに提示する必要があります。これまでのところ、これを行う唯一の方法は次のように書くことです。

for (String id : myMap.keySet()) {
    // get the image like this "myMap.get(id)" 
}

したがって、MapListの両方を実装するクラスがあれば、次のように簡単に記述できます。

for (Image img : myMap) {
  // the image is img
}

誰かがそのような実装を知っていますか?

[〜#〜] edit [〜#〜]:回答(すべて正解、投票済み)を表示した後、マップも並べ替える必要があることに気付きました。私が「ソート済み」と言うとき、私が意味するのは、特定の順序で値を持たせたいということです。つまり、変更できるようにします。これが元の質問ではないことはわかっていますが、それが必要であることに気づきました。

編集2:私は優柔不断のようです。必要なのは、並べ替えられたマップではなく、順序付けられたマップです。混乱してすみません、人々。

19

特定の順序でアイテムが必要な場合は、 LinkedHashMap が友達です-アイテムを挿入順序で保持します。 TreeMapは、指定したコンパレータまたはキーのcompareToメソッドのいずれかによって定義された順序でアイテムを保持します。

35
Tadeusz Kopec

順序付けられたマップについては、 LinkedHashMap を参照してください。これにより、キーが挿入順に保持されます。

SortedMap を使用すると、キーが並べ替えられた順序で保持されます。 ( TreeMap が最も一般的な実装です。)

使用できるのはmap.entrySet()です。これにより、MapEntriesのセットを反復処理できます。

詳細については、 javadoc を確認してください。

19
jjnguy

あなたはすでにたくさんの実用的な答えを持っています。しかし、質問に直接答える...

JavaでMapインターフェイスとListインターフェイスの両方を実装するクラスがあるかどうか迷っていました。

...それは単に不可能であることに言及する価値があります。 remove(Object)メソッドが障害です。

Mapインターフェースでは、その署名は次のとおりです。

V remove(Object key);

そして、Listインターフェースでは次のようになります。

boolean remove(Object o);
8

Map.values() メソッドを使用できます。このメソッドはCollectionを返します。

3
akf

これにより、保存された値のコレクションが得られます

myMap.values()
2
Stroboskop

これを試して:

for (Image img : myMap.values()) {
    // the image is img
}

ソートされたマップについては、 Java.util.SortedMap 実装。 Java.util.TreeMap が最も頻繁な選択です。保証された反復順序が必要な場合は、 Java.util.LinkedHashMap 。要素をマップに配置するのと同じ順序で反復を提供します。または、オプションで、最後にアクセスした順序で。キー(追加後)をマップの最後に移動する場合は、明示的に削除してから再度配置する必要があります。

2
Rorick

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());
0
dfa