关于集合:在Java中实现Map和List接口?

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
class Foo implements Map, List {
    // add all methods here
}

我收到编译错误:

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)方法。不能通过索引选择条目。)


应该指出的是,错误的原因是Map包含以下remove方法的定义:

1
V remove(Object key)

List定义:

1
boolean remove(Object o)

而且,在Java中,方法不能根据其返回类型重载,因此它们是冲突的签名,并且不能在同一个类中实现。


正如您所注意到的,您无法在同一个类上同时实现ListMap。但是对于你需要的东西,也没有必要。您需要的是MapList接口都可以访问data。有点像使用mapSet()作为集合访问Map数据或使用Map.values()访问集合。

简而言之,您需要的是数据的2个视图,一个实现List的视图和另一个实现Map的视图。

如果有一个视图占主导地位(例如Map),那么你可以给你的地图实现一个方法List getAsList(),它将数据显示为List,由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")
因为它只是一个地图实现。


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

我想知道使用List>是否能满足您的需求。