在Java中实现Map和List接口?

ccl*_*eve 6 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"
Run Code Online (Sandbox Code Playgroud)

这是问题所在:当我创建这个类时:

class Foo implements Map, List {
    // add all methods here
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

"The return type is incompatible with Map.remove(Object)"
public boolean remove(Object o) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如果我没有实现Map和List接口,那么有许多Java集合方法无法在此数据结构上使用.

(另外,上面的Java Ordered Map中提出的解决方案不起作用的原因是LinkedHashMap没有get(int)方法.不能通过索引选择条目.)

Pau*_*des 5

LinkedHashMap可以满足您的需求.

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

  • @Adam:然后使用迭代器扩展LinkedHashMap并实现get(int index).你甚至可以使用名为`table`的后备Entry []数组(尽管我使用迭代器来表示健壮性). (2认同)

ext*_*eon 5

当你发现你不能同时实现List,并Map在同一类.但是对于你需要的东西,也没有必要.您需要的是dataa MapList接口都可以访问.像访问位Map数据作为一组的entrySet()使用或作为集合Map.values() .

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

如果有一个视图占主导地位(例如Map),那么您可以为地图实现提供一种方法List getAsList(),该方法将数据显示为List,并由Map的数据支持.

编辑

Paulo Guedes给出的答案应该为您服务.已经有一个符合您要求的Map实现.我的答案有点笼统,关于使用多个不兼容的接口呈现相同的数据,其中简单的适配器是不够的.


jjn*_*guy 5

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

V remove(Object key)
Run Code Online (Sandbox Code Playgroud)

虽然List定义:

boolean remove(Object o) 
Run Code Online (Sandbox Code Playgroud)

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