如何在Guava's computing map之上构建SortedMap(反之亦然)?我想要有序的地图键以及即时计算值。
答案 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>