Ordered List Map implementation in Java
Asked Answered
R

7

19

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.

Renaissance answered 31/7, 2009 at 12:11 Comment(0)
C
37

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.

Castano answered 31/7, 2009 at 12:38 Comment(2)
it would be nice to be able to change the item order though :(Renaissance
I think, you can re-put item to the end of map by removing it and putting again.Survey
B
19

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.

Buskirk answered 31/7, 2009 at 12:15 Comment(2)
thanks for the answer. please check out my edits as my question has slightly changed.Renaissance
Thanks. I usually prefer brevity over long-windedness.Buskirk
D
8

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);
Donnettedonni answered 31/7, 2009 at 13:43 Comment(0)
T
3

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

Toolis answered 31/7, 2009 at 12:15 Comment(1)
nice answer. please check out my edits as my question has slightly changed.Renaissance
I
2

This gives you a collection of the stored values

myMap.values()
Ironmonger answered 31/7, 2009 at 12:15 Comment(2)
nice answer. please check out my edits as my question has slightly changed.Renaissance
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().Ironmonger
S
2

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.

Survey answered 31/7, 2009 at 12:16 Comment(1)
nice answer. please check out my edits as my question has slightly changed.Renaissance
H
0

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());
Hereabout answered 31/7, 2009 at 12:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.