我想要一个在Java中实现Map和List接口的对象。这个想法类似于这个问题中的问题:Java Ordered Map
我想将名称/值对添加到列表中并使列表保留序列,但也能够按名称进行查找:
foo.put("name0", "value0");
foo.put("name1", "value1");
foo.get(1); --> Map.Entry("name1", "value1")
foo.get("name0"); --> "value0"
问题在于:当我创建这个类时:
class Foo implements Map, List {
// add all methods here
}
我收到编译错误:
"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)方法。不能通过索引选择条目。)
答案 0 :(得分:5)
LinkedHashMap可以满足您的需求。
Map接口的哈希表和链表实现,具有可预测的迭代顺序。这个实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。
答案 1 :(得分:5)
正如您所注意到的,您无法在同一个课程上同时实施List
和Map
。但是对于你需要的东西,也没有必要。您需要的是data
和Map
接口都可以访问List
。有点像使用entrySet()中的Map.values()或使用{{3}}作为集合访问Map
数据。
简而言之,您需要的是有关数据的2个视图,一个实现List
的视图和另一个实现Map
的视图。
如果有一个视图占优势(例如Map),那么您可以为地图实现提供一个方法List getAsList()
,该方法将数据显示为List,并由Map的数据支持。
修改强>
Paulo Guedes给出的答案应该为你服务。已经有一个符合您要求的Map实现。我的答案有点笼统,关于使用多个不兼容的接口呈现相同的数据,其中简单的适配器是不够的。
答案 2 :(得分:5)
应该指出错误的原因是Map
包含以下remove
方法的定义:
V remove(Object key)
虽然List
定义了:
boolean remove(Object o)
而且,在Java中,方法不能根据其返回类型重载,因此它们是冲突的签名,并且不能在同一个类中实现。
答案 3 :(得分:2)
为什么不实现自己的界面?
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();
}
答案 4 :(得分:1)
Map
和List
接口包含remove
方法的冲突定义。您不能在单个类中实现这两个,因为您不能仅使用返回类型的差异覆盖相同的方法签名。
我想知道使用List<Map.Entry<K,V>>
是否能满足您的需求。
答案 5 :(得分:1)
除了Dave Costa所说的你应该使用LinkedHashMap。这是Map,但它保留了元素插入的顺序。
作为map,它实现了values()方法,所以你可以说 new ArrayList(map.values())。get(0) 模仿列表功能。
但你也可以说 map.get( “1”) 因为它只是一个地图实现。