Implement both Map and List interface in Java?
我想要一个在Java中实现Map和List接口的对象。 这个想法类似于这个问题中的问题:Java Ordered Map
我想将名称/值对添加到列表中并使列表保留序列,但也能够按名称进行查找:
1 2 3 4 | foo.put("name0","value0"); foo.put("name1","value1"); foo.get(1); --> Map.Entry("name1","value1") foo.get("name0"); -->"value0" |
这是问题所在:当我创建这个类时:
我收到编译错误:
1 2 3 4 | "The return type is incompatible with Map.remove(Object)" public boolean remove(Object o) { return false; } |
如果我没有实现Map和List接口,那么有许多Java集合方法无法在此数据结构上使用。
(另外,上面的Java Ordered Map中提出的解决方案不起作用的原因是LinkedHashMap没有get(int)方法。不能通过索引选择条目。)
应该指出的是,错误的原因是
1 |
而
1 |
而且,在Java中,方法不能根据其返回类型重载,因此它们是冲突的签名,并且不能在同一个类中实现。
正如您所注意到的,您无法在同一个类上同时实现
简而言之,您需要的是数据的2个视图,一个实现
如果有一个视图占主导地位(例如Map),那么你可以给你的地图实现一个方法
编辑
Paulo Guedes给出的答案应该为您服务。已经有一个符合您要求的Map实现。我的答案有点笼统,关于使用多个不兼容的接口呈现相同的数据,其中简单的适配器是不够的。
LinkedHashMap可以满足您的需求。
Map接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。
你为什么不实现自己的界面?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public interface HashListMap { public boolean add(Object arg0); public void add(int arg0, Object arg1); public boolean addAll(Collection arg0); public boolean addAll(int arg0, Collection arg1); public void clear(); public boolean contains(Object arg0); public boolean containsAll(Collection arg0); public Object get(int arg0); public int indexOf(Object arg0); public boolean isEmpty(); public Iterator iterator(); public int lastIndexOf(Object arg0); public ListIterator listIterator(); public ListIterator listIterator(int arg0); public boolean remove(Object arg0); public Object remove(int arg0); public boolean removeAll(Collection arg0); public boolean retainAll(Collection arg0); public Object set(int arg0, Object arg1); public int size(); public List subList(int arg0, int arg1); public Object[] toArray(); public Object[] toArray(Object[] arg0); public boolean containsKey(Object arg0); public boolean containsValue(Object arg0); public Set entrySet(); public Object get(Object arg0); public Set keySet(); public Object put(Object arg0, Object arg1); public void putAll(Map arg0); public Collection values(); |
}
除了Dave Costa所说的你应该使用LinkedHashMap。这是Map,但它保留了元素插入的顺序。
作为map,它实现了values()方法,所以你可以说
new ArrayList(map.values())。get(0)
模仿列表功能。
但你也可以说
map.get("1")
因为它只是一个地图实现。
我想知道使用