一个有序的ComputingMap?

时间:2010-12-23 13:58:22

标签: java guava sortedmap

如何在Guava's computing map之上构建SortedMap(反之亦然)?我想要有序的地图键以及即时计算值。

3 个答案:

答案 0 :(得分:2)

最简单的可能是使用ConcurrentSkipListMap和memoizer惯用法(请参阅JCiP),而不是依赖于MapMaker中预先构建的未排序类型。您可以用作基础的示例是decorator实现。

答案 1 :(得分:0)

可能你可以做这样的事情。这不是一个完整的实现。只是传达这个想法的样本。

public class SortedComputingMap<K, V> extends TreeMap<K, V> {
    private Function<K, V> function;
    private int maxSize;

    public SortedComputingMap(int maxSize, Function<K, V> function) {
        this.function = function;
        this.maxSize = maxSize;
    }

    @Override
    public V put(K key, V value) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> map) {
        throw new UnsupportedOperationException();
    }

    @Override
    public V get(Object key) {
        V tmp = null;
        K Key = (K) key;
        if ((tmp = super.get(key)) == null) {

            super.put(Key, function.apply(Key));
        }
        if (size() > maxSize)
            pollFirstEntry();
        return tmp;
    }

    public static void main(String[] args) {
        Map<Integer, Long> sortedMap = new SortedComputingMap<Integer, Long>(3,
                new Function<Integer, Long>() {
                    @Override
                    public Long apply(Integer n) {
                        Long fact = 1l;
                        while (n != 0)
                            fact *= n--;
                        return fact;
                    }
                });

        sortedMap.get(12);
        sortedMap.get(1);
        sortedMap.get(2);
        sortedMap.get(5);

        System.out.println(sortedMap.entrySet());

    }

}

答案 2 :(得分:0)

如果您需要线程安全,这可能会很棘手,但如果您不这样做,我会建议接近Emil的建议,但使用ForwardingSortedMap而不是直接扩展TreeMap。< / p>