我想要一个在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)方法.不能通过索引选择条目.)
LinkedHashMap可以满足您的需求.
Map接口的哈希表和链表实现,具有可预测的迭代顺序.此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表.
当你发现你不能同时实现List,并Map在同一类.但是对于你需要的东西,也没有必要.您需要的是dataa Map和List接口都可以访问.像访问位Map数据作为一组的entrySet()使用或作为集合Map.values() .
简而言之,您需要的是对数据的2个视图,一个实现a的List视图和另一个实现的视图Map.
如果有一个视图占主导地位(例如Map),那么您可以为地图实现提供一种方法List getAsList(),该方法将数据显示为List,并由Map的数据支持.
编辑
Paulo Guedes给出的答案应该为您服务.已经有一个符合您要求的Map实现.我的答案有点笼统,关于使用多个不兼容的接口呈现相同的数据,其中简单的适配器是不够的.
应该指出的是,错误的原因是Map包含以下remove方法的定义:
V remove(Object key)
Run Code Online (Sandbox Code Playgroud)
虽然List定义:
boolean remove(Object o)
Run Code Online (Sandbox Code Playgroud)
并且,在Java中,方法不能基于其返回类型而重载,因此它们是冲突的签名,并且不能在同一个类中实现.
| 归档时间: |
|
| 查看次数: |
5339 次 |
| 最近记录: |