Сортированный ComputingMap? - PullRequest
       28

Сортированный ComputingMap?

3 голосов
/ 23 декабря 2010

Как я могу построить SortedMap поверх вычислительной карты Гуавы (или наоборот)?Я хочу отсортированные ключи карты, а также вычисления значений на лету.

Ответы [ 3 ]

2 голосов
/ 30 декабря 2010

Возможно, проще всего использовать ConcurrentSkipListMap и идиому памятки (см. JCiP), а не полагаться на предварительно созданные несортированные типы из MapMaker. Примером, который можно использовать в качестве основы, является реализация decorator .

0 голосов
/ 28 декабря 2010

Если вам нужна безопасность потоков, это может быть сложно, но если вы этого не сделаете, я бы порекомендовал что-то близкое к предложению Эмиля, но с использованием ForwardingSortedMap вместо расширения TreeMap напрямую.

0 голосов
/ 24 декабря 2010

Может быть, вы можете сделать что-то вроде этого. Это не полная реализация. Просто пример для передачи идеи.

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());

    }

}
...