I’d like to have an object that implements both the Map and the List interfaces in Java. The idea is similar to the problem in this question: Java Ordered Map
I want to add name/value pairs to a list and have the list preserve the sequence, but also be able to do lookups by name:
foo.put("name0", "value0");
foo.put("name1", "value1");
foo.get(1); --> Map.Entry("name1", "value1")
foo.get("name0"); --> "value0"
Here’s the problem: when I create this class:
class Foo implements Map, List {
// add all methods here
}
I get a compile error:
"The return type is incompatible with Map.remove(Object)"
public boolean remove(Object o) {
return false;
}
If I don’t implement the Map and List interfaces, then there are lots of Java collections methods that aren’t available to use on this data structure.
(Also, the reason that the solution proposed in Java Ordered Map above doesn’t work is that LinkedHashMap doesn’t have a get(int) method. Can’t select entries by index.)
As you noticed you cannot implement both
ListandMapon the same class. But for what you need that should also not be necessary. What you need is that thedatacan be accessed by both aMapand aListinterface. A bit like accessingMapdata as a set in entrySet() or as a Collection using Map.values().In short, what you need is 2 views on the data, one view implementing a
Listand another view implementingMap.If there is one view dominant (for example Map) then you could give your map implementation a method
List getAsList()which presents the data as a List, backed by the data of the Map.EDIT
The answer given by Paulo Guedes should serve you. There already is a Map implementation with your requirements. My answer is a bit more general, about presenting the same data using multiple incompatible interfaces where a simple Adapter is not enough.