我有一个HashMap<k,v>
的课程。
此HashMap
的值的类型是一个静态类,它有两个不同的对象作为属性。即,
public class Example {
private HashMap<String, StaticClassExample> map;
private static class StaticClassExample {
private Object1 o1;
private Object2 o2;
//...
}
//...
}
我的问题是如何有效地进行这项操作:
public List<Object1> getAllObject1() {}
我知道我可以这样做:map.values()
然后迭代值集合并从每个StaticClassExample获取Object1,但这不会有效。
可能我要求或者我必须为我的目的创建另一个hashmap?
答案 0 :(得分:0)
如果您不介意一些内存开销,可以使用o1-values保留一个单独的列表:
public class HashMapList
{
private HashMap<String, StaticClassExample> map = new HashMap<String, HashMapList.StaticClassExample>();
private List<Object> o1List = new LinkedList<Object>();
public static class StaticClassExample
{
private Object o1;
private Object o2;
}
public void addStaticClassExample(String key, StaticClassExample example)
{
StaticClassExample oldVal = map.put(key, example);
if(oldVal != null)
{
o1List.remove(oldVal.o1);
}
o1List.add(example.o1);
}
public StaticClassExample getStaticClassExampleByKey(String key)
{
return map.get(key);
}
public void removeStaticClassExampleByKey(String key)
{
StaticClassExample removed = map.remove(key);
if(removed != null)
{
o1List.remove(removed.o1);
}
}
public List<Object> getAllObject1()
{
return Collections.unmodifiableList(o1List);
}
}
当然,这需要您将HashMap封装在类中,并且永远不会直接访问它,因为使用该类的人可以直接修改HashMap,并且List将不再与Map同步。请注意,getAllObject1
返回内部列表的不可修改视图,因此无法从类外部修改它。