3

Guavaのコンピューティングマップの上にSortedMapを構築するにはどうすればよいですか(またはその逆)?ソートされたマップキーと、オンザフライで値を計算する必要があります。

4

3 に答える 3

2

最も簡単な方法は、MapMaker のビルド済みのソートされていない型に依存するのではなく、おそらく ConcurrentSkipListMap と memoizer のイディオム (JCiP を参照) を使用することです。基礎として使用できる例は、デコレータの実装です。

于 2010-12-30T19:27:35.500 に答える
0

スレッドセーフが必要な場合、これは注意が必要ですが、そうでない場合は、Emilの提案に近いものをお勧めしますが、直接ForwardingSortedMap拡張するのではなく、使用しTreeMapます。

于 2010-12-28T18:49:28.300 に答える
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());

    }

}
于 2010-12-24T06:44:59.270 に答える