在Java中实现映射和列表接口?

在Java中实现映射和列表接口?,java,collections,Java,Collections,我希望有一个在Java中实现Map和List接口的对象。这个想法类似于这个问题中的问题: 我希望向列表中添加名称/值对,并使列表保留序列,但也能够按名称进行查找: foo.put("name0", "value0"); foo.put("name1", "value1"); foo.get(1); --> Map.Entry("name1", "value1") foo.get("name0"); --> "value0" 问题是:当我创建这个类时: class Foo imple

我希望有一个在Java中实现Map和List接口的对象。这个想法类似于这个问题中的问题:

我希望向列表中添加名称/值对,并使列表保留序列,但也能够按名称进行查找:

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)方法。无法按索引选择条目。)

满足您的需要

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

满足您的需要


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

正如您所注意到的,您不能在同一个类上同时实现
list
Map
。但对于你所需要的,这也不应该是必要的。您需要的是可以通过
映射
列表
界面访问
数据
。有点像访问
Map
数据,将其作为集合或使用

简而言之,您需要的是数据上的两个视图,一个视图实现
列表
,另一个视图实现
映射

如果有一个视图占主导地位(例如Map),则可以为Map实现提供一个方法
List getAsList()
,该方法将数据显示为列表,并以地图的数据为后盾

编辑


保罗·盖德斯给出的答案应该对你有用。已经有了符合您需求的映射实现。我的回答有点笼统,关于使用多个不兼容的接口来表示相同的数据,而一个简单的适配器是不够的。

正如您所注意到的,您不能在同一个类上同时实现
List
Map
。但对于你所需要的,这也不应该是必要的。您需要的是可以通过
映射
列表
界面访问
数据
。有点像访问
Map
数据,将其作为集合或使用

简而言之,您需要的是数据上的两个视图,一个视图实现
列表
,另一个视图实现
映射

如果有一个视图占主导地位(例如Map),则可以为Map实现提供一个方法
List getAsList()
,该方法将数据显示为列表,并以地图的数据为后盾

编辑


保罗·盖德斯给出的答案应该对你有用。已经有了符合您需求的映射实现。我的回答更一般一些,关于使用多个不兼容的接口来表示相同的数据,而一个简单的适配器是不够的。

映射和
列表
接口包含对
删除
方法的冲突定义。不能在单个类中同时实现这两个函数,因为不能仅用不同的返回类型重写相同的方法签名


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

映射和
List
接口包含对
remove
方法的冲突定义。不能在单个类中同时实现这两个函数,因为不能仅用不同的返回类型重写相同的方法签名


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

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

V remove(Object key)
列表
定义:

boolean remove(Object o) 

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

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

V remove(Object key)
列表
定义:

boolean remove(Object o) 

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

为什么不实现自己的接口

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();

}为什么不实现自己的接口

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();

}除了戴夫·科斯塔所说的,你还应该使用LinkedHashMap。这是一个映射,但它保留了元素插入的顺序

作为映射,它实现values()方法 新建ArrayList(map.values()).get(0) 模拟列表功能

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

除了Dave Costa所说的你应该使用LinkedHashMap之外。这是一个映射,但它保留了元素插入的顺序

作为映射,它实现values()方法 新建ArrayList(map.values()).get(0) 模拟列表功能

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

你反对扩展
LinkedHashMap
,如果不反对,为什么不尝试添加
get(int)
方法呢?@Adam链接被破坏了,但我想我们知道它说了什么,就从URL;)如果您的映射是不可变的,并且没有空键或值,Guava
ImmutableMap
可能会帮助您。它是
keySet()
类型的
ImmutableSet
,提供
asList()
视图。您是否反对扩展
LinkedHashMap
,如果不是,为什么不尝试向其添加
get(int)
方法?@Adam该链接