-3

需要一个动态数据结构,可能类似于 MAP(Java.util.Map),可以存储 String 和 Object。并且该对象可能再次需要存储另一个映射,该映射可以存储字符串和对象。

4

3 回答 3

2

我怀疑请求者正在寻找如下内容:

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,因此,如果K将树顶部和 之间的所有 s连接起来V,就会得到S用作键的 s。上面呈现了一个(非常近似)的接口Map<K,K, ... , V>,但内部是Map<List<K>, V>

于 2015-04-03T00:24:00.583 回答
0

您可以将地图(和其他容器)嵌套到任意深度。这将一个地图放在另一个地图中,另一个地图......总深度为 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"

请注意,声明 a 的代价Map<String, Object>是,每当您通过 访问某些内容时get(),您需要将其转换为实际的任何内容,以便能够将其用作比 a 更具体的内容Object

于 2013-11-09T17:27:05.847 回答
-1

听起来您需要MultimapTrie

于 2013-11-09T17:14:12.493 回答