tags:

views:

1174

answers:

7

I was wandering if there is a class out there that implements both Map and List interfaces in Java.

I have a data structure that is primarily a Map. I map strings (IDs) to Images. But in a specific part of my code i need to present the user with all the available IDed Images. The only way to do that so far is to write this :

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

so it would be nice to have a class that implements both Map and List so i could simply write :

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

Does anyone know of such an implementation?

EDIT: after viewing the answers (which are all correct, voted up) i now realize i would also need the map to be sorted. When i say sorted all i mean is that i would like it to have the values in a specific order, one that i would be able to modify. I know this is not the original question but i just realized that i need that.

EDIT 2: It seems i am indecisive. What i need is an ordered map not a sorted one. sorry for the confusion people.

+11  A: 

For an ordered Map, look at the LinkedHashMap. That will keep your keys in the order of insertion.

If you use a SortedMap it will keep the keys in sorted order. (The TreeMap is the most common implementation.)

What you can use is map.entrySet(). That will allow you to iterate over the Set of MapEntries.

Check out the javadoc for a bit more info.

jjnguy
+1 short and good answer.
bastianneu
thanks for the answer. please check out my edits as my question has slightly changed.
Savvas Dalkitsis
Thanks. I usually prefer brevity over long-windedness.
jjnguy
+2  A: 

This gives you a collection of the stored values

myMap.values()
Stroboskop
nice answer. please check out my edits as my question has slightly changed.
Savvas Dalkitsis
A HashMap will produce a value collection sorted by hash - which is usually not what you want. So go with jinguy's answer and use a TreeMap and then call values().
Stroboskop
+2  A: 

you can use the Map.values() method, which returns a Collection.

akf
nice answer. please check out my edits as my question has slightly changed.
Savvas Dalkitsis
+1  A: 

Try this:

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

For sorted map look at java.util.SortedMap implementations. java.util.TreeMap is the most often choice. If you need just guaranteed iteration order you can try java.util.LinkedHashMap. It offers iteration in the same order as you put elements to map. Or, optionally, in last-accessed order. If you'd like to move key (once added) to the end of map, you must explicitly remove it and put again.

Rorick
nice answer. please check out my edits as my question has slightly changed.
Savvas Dalkitsis
A: 

you can use a TreeMap it is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time:

TreeMap<String, Image> mapByName = new TreeMap<String, Image>(new ByNameComparator());

where ByNameComparator() is a Comparator. Alternatively you can use the values() methond and sort using Collections.sort():

Collection<Image> images = mapByName.values();
Collections.sort(images, new BySizeComparator());
dfa
+9  A: 

If you need your items in a specific order, LinkedHashMap is your friend - it keeps items in insertion order. TreeMap will keep your items in an order defined by either a Comparator you give or a compareTo method of the key.

Tadeusz Kopec
thank you this is exactly what i need.
Savvas Dalkitsis
it would be nice to be able to change the item order though :(
Savvas Dalkitsis
I think, you can re-put item to the end of map by removing it and putting again.
Rorick
yes but you can't do put(item,location) :(
Savvas Dalkitsis
+1  A: 

You've got already a bunch of practical answers. But answering directly the question...

I was wandering if there is a class out there that implements both Map and List interfaces in Java.

... it's worth to mention that it's simply impossible. remove(Object) method is the obstacle.

In Map interface its signature is:

V remove(Object key);

And in List interface it's:

boolean remove(Object o);
Grzegorz Oledzki