在Java中实现Map和List接口?

时间:2010-11-18 19:14:55

标签: java collections

我想要一个在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)方法。不能通过索引选择条目。)

6 个答案:

答案 0 :(得分:5)

LinkedHashMap可以满足您的需求。

Map接口的哈希表和链表实现,具有可预测的迭代顺序。这个实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。

答案 1 :(得分:5)

正如您所注意到的,您无法在同一个课程上同时实施ListMap。但是对于你需要的东西,也没有必要。您需要的是dataMap接口都可以访问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)

MapList接口包含remove方法的冲突定义。您不能在单个类中实现这两个,因为您不能仅使用返回类型的差异覆盖相同的方法签名。

我想知道使用List<Map.Entry<K,V>>是否能满足您的需求。

答案 5 :(得分:1)

除了Dave Costa所说的你应该使用LinkedHashMap。这是Map,但它保留了元素插入的顺序。

作为map,它实现了values()方法,所以你可以说 new ArrayList(map.values())。get(0) 模仿列表功能。

但你也可以说 map.get( “1”) 因为它只是一个地图实现。