Question

I was wondering if there is a class out there that implements both the 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.

Was it helpful?

Solution

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.

OTHER TIPS

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.

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);

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

This gives you a collection of the stored values

myMap.values()

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.

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());
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top