提问人:Igor Golovin 提问时间:5/26/2018 最后编辑:Igor Golovin 更新时间:5/3/2021 访问量:1259
如何创建由 Map 支持的可变列表
How do I create a mutable List backed by Map
问:
如果我有将值映射到键的方法,我该如何返回一个支持者?List<E>
Map<K, E>
Map
valueToKeyMapper
class Foo {
private Map<Integer, String> backedMap = new HashMap<Integer, String>();
public List<String> getList() {
// NEED TO RETURN LIST BACKED BY MAP
}
public String getById(Integer id) {
return backedMap.get(id);
}
private static Integer valueToKeyMapper(String value) {
// just as exampl. In reality value will be POJO with method like getId()
return value.hashCode();
}
}
代码应如下所示(简单示例):
Foo foo = new Foo();
foo.getList().add("something");
String value = foo.getById("something".hashCode());
// I should see something
笔记:
List
应该是可变的,并且更改必须在底层中传播Map
- 我无法修改对象的公共方法,因为它用于其他项目
Foo
- 我不在乎顺序
List
- 该方法应继续快速工作
getById
答:
0赞
Sumit
5/26/2018
#1
试试这样的东西:---
List<String> list = new ArrayList<>();
Set keys = backedMap.keySet();
for (Iterator i = keys.iterator(); i.hasNext(); ) {
Integer key = (Integer) i.next();
String value = (String) backedMap.get(key);
list.add(value);
}
//To print Values in ArrayList :--
for(String s : list) {
System.out.println("printing element -- " + s);
}
0赞
Igor Golovin
5/26/2018
#2
在 github 上使用它的尝试:ListBackedByMap.javaList
它使用 ForwardingList 在地图中维护列表的内部副本。
我发现这个 impl 有两个问题:
- 它在内存中维护元素的额外副本
- 它不会尝试在迭代器中修改列表。
ConcurrentModificationException
此处提供测试。
上一个:可变借入循环
评论
map.put(Foo.valueToKeyMapper(value), value)
value
value.getId()
List
Set
HashSet
HashMap