【发布时间】:2013-11-09 17:10:09
【问题描述】:
需要一个动态数据结构,可能类似于MAP(Java.util.Map),可以存储String和Object。并且那个 Object 可能又需要存储另一个 map,它可以存储 String 和 Object。
【问题讨论】:
-
那么,您尝试过什么?问题出在哪里?
需要一个动态数据结构,可能类似于MAP(Java.util.Map),可以存储String和Object。并且那个 Object 可能又需要存储另一个 map,它可以存储 String 和 Object。
【问题讨论】:
我怀疑请求者正在寻找类似以下的内容:
class MultilevelMap<K,V> extends HashMap<List<K>,V> {
@SafeVarargs
public final put(V value, K keys...) {
put(makeKey(keys), value);
}
@SafeVarargs
public final V get(K keys...) {
return get(makeKey(keys));
}
// The remainder of this class is left as a tedious exercise for the reader
private List<K> makeKey(K[] keys) {
List<K> key = new ArrayList<K>(keys.size);
for(K k: keys) {
key.add(k);
}
return key;
}
}
Trie,据我所知,它是相似的,但相反。它提供了一个Map<S,V> 的接口,但在内部实现为可变深度Map<K,Map<K, ... V>>,其中K 是S 的连续后缀,这样,如果您在顶部之间连接所有Ks树和V,您将获得用作密钥的S。上面呈现了一个(非常近似的)Map<K,K, ... , V> 的接口,但内部是Map<List<K>, V>。
【讨论】:
您可以将地图(和其他容器)嵌套到任意深度。这会将一个地图放在另一个地图中……总深度为 10:
private Map<String, Object> nest(int levelsLeft, Map<String, Object> parent) {
if (levelsLeft > 0) {
parent.put("key" + levelsLeft,
nest(levelsLeft - 1, new HashMap<String, Object>()));
}
return parent;
}
// from somewhere else
Map<String, Object> nested = nest(10, new Map<String, Object>());
((Map<String, Object>)nested.get("key10")).get("key9"); // goes all the way down to "key1"
请注意,声明Map<String, Object> 的代价是,每当您通过get() 访问某些内容时,您需要将其转换为实际的任何内容,以便能够将其用作比Object 更具体的内容.
【讨论】: