0

我需要一个 Map impl,它由堆叠的地图组成,我可以push()pop(),如果它们属于被推送/弹出的地图,则这些值将被“添加”或“删除”。并且将在顶部/底部(或可选的底部/顶部)搜索这些值。

JDK 或其他地方是否有现有的 impl?

例子:

    • 地图4
      • foo => aaa
      • 酒吧 => 45
    • 地图3
      • 酒吧 => 22
    • 地图2
      • foo => ccc
      • baz => 呜呜
    • 地图1

为此,get("baz")将返回"uuu"get("foo")将返回"aaa"size()将返回3等。这类似于 JavaScript 的原型继承。

一个 impl 我希望有一些更复杂的 impl,它不会在我每次调用任何方法时真正遍历所有层。读取方法将比 push()/pop() 更频繁,因此在此期间可能会有一些预计算。

4

2 回答 2

0

您可以将 Stack 作为包装器。有一个 Map<'String, Map> (这里的 String 是地图的名称)。将推送和弹出作为 API 公开。您问题中有趣的部分是,定义推送和弹出?这些方法的签名实际上是什么样子的?实际上,不是很清楚您要达到的目标是什么?

于 2013-06-16T20:35:17.127 回答
0

因此,JDK 中没有这样的内置结构,但可以使用LinkedList包含Map的 s 来实现。

LinkedListList实现了,Queue和的所有三个Deque,也许这有点矫枉过正,但是哦...

示例代码如下;然而,Map界面并没有真正被遵守(好奇你会怎么做.equals().hashCode()在这里?甚至不谈论.clear()):

public final class StackedMap<K, V>
    implements Map<K, V>
{
    private final Map<K, V> NO_MAP = new HashMap<K, V>();
    private final LinkedList<Map<K, V>> maps = new LinkedList<>();

    private Map<K, V> currentMap = NO_MAP;

    public void push(Map<K, V> map)
    {
        maps.push(map);
        currentMap = map;
    }

    public Map<K, V> pop()
    {
        return currentMap = maps.pop();
    }

    @Override
    public V get(K key)
    {
        V ret;

        for (final Map<K, V> map: maps)
            if ((ret = map.get(key)) != null)
                break;
        return ret;
    }

    // etc
}

未经测试等

于 2013-06-16T20:43:55.980 回答